1、模式定义

Repository 是一个独立的层,介于领域层与数据映射层(数据访问层)之间。它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问。Repository 是仓库管理员,领域层需要什么东西只需告诉仓库管理员,由仓库管理员把东西拿给它,并不需要知道东西实际放在哪。

Repository 模式是架构模式,在设计架构时,才有参考价值。应用 Repository 模式所带来的好处,远高于实现这个模式所增加的代码。只要项目分层,都应当使用这个模式。

2、UML类图

3、示例代码

Post.php

<?phpnamespace DesignPatterns\More\Repository;/**
 * Post 类  * @package DesignPatterns\Repository  */ class Post { /**  * @var int  */ private $id; /**  * @var string  */ private $title; /**  * @var string  */ private $text; /**  * @var string  */ private $author; /**  * @var \DateTime  */ private $created; /**  * @param int $id  */ public function setId($id) { $this->id = $id; } /**  * @return int  */ public function getId() { return $this->id; } /**  * @param string $author  */ public function setAuthor($author) { $this->author = $author; } /**  * @return string  */ public function getAuthor() { return $this->author; } /**  * @param \DateTime $created  */ public function setCreated($created) { $this->created = $created; } /**  * @return \DateTime  */ public function getCreated() { return $this->created; } /**  * @param string $text  */ public function setText($text) { $this->text = $text; } /**  * @return string  */ public function getText() { return $this->text; } /**  * @param string $title  */ public function setTitle($title) { $this->title = $title; } /**  * @return string  */ public function getTitle() { return $this->title; } }

PostRepository.php

<?phpnamespace DesignPatterns\More\Repository;use DesignPatterns\More\Repository\Storage; /**  * Post 对应的 Repository  * 该类介于数据实体层(Post) 和访问对象层(Storage)之间  *  * Repository 封装了持久化对象到数据存储器以及在展示层显示面向对象的视图操作  *  * Repository 还实现了领域层和数据映射层的分离和单向依赖  *  * PostRepository 类  * @package DesignPatterns\Repository  */ class PostRepository { private $persistence; public function __construct(Storage $persistence) { $this->persistence = $persistence; } /**  * 通过指定id返回Post对象  *  * @param int $id  * @return Post|null  */ public function getById($id) { $arrayData = $this->persistence->retrieve($id); if (is_null($arrayData)) { return null; } $post = new Post(); $post->setId($arrayData['id']); $post->setAuthor($arrayData['author']); $post->setCreated($arrayData['created']); $post->setText($arrayData['text']); $post->setTitle($arrayData['title']); return $post; } /**  * 保存指定对象并返回  *  * @param Post $post  * @return Post  */ public function save(Post $post) { $id = $this->persistence->persist(array( 'author' => $post->getAuthor(), 'created' => $post->getCreated(), 'text' => $post->getText(), 'title' => $post->getTitle() )); $post->setId($id); return $post; } /**  * 删除指定的 Post 对象  *  * @param Post $post  * @return bool  */ public function delete(Post $post) { return $this->persistence->delete($post->getId()); } }

Storage.php

<?phpnamespace DesignPatterns\More\Repository;/**
 * Storage接口  *  * 该接口定义了访问数据存储器的方法  * 具体的实现可以是多样化的,比如内存、关系型数据库、NoSQL数据库等等  *  * @package DesignPatterns\Repository  */ interface Storage { /**  * 持久化数据方法  * 返回新创建的对象ID  *  * @param array() $data  * @return int  */ public function persist($data); /**  * 通过指定id返回数据  * 如果为空返回null  *  * @param int $id  * @return array|null  */ public function retrieve($id); /**  * 通过指定id删除数据  * 如果数据不存在返回false,否则如果删除成功返回true  *  * @param int $id  * @return bool  */ public function delete($id); }

MemoryStorage.php

<?phpnamespace DesignPatterns\More\Repository;use DesignPatterns\More\Repository\Storage; /**  * MemoryStorage类  * @package DesignPatterns\Repository  */ class MemoryStorage implements Storage { private $data; private $lastId; public function __construct() { $this->data = array(); $this->lastId = 0; } /**  * {@inheritdoc}  */ public function persist($data) { $this->data[++$this->lastId] = $data; return $this->lastId; } /**  * {@inheritdoc}  */ public function retrieve($id) { return isset($this->data[$id]) ? $this->data[$id] : null; } /**  * {@inheritdoc}  */ public function delete($id) { if (!isset($this->data[$id])) { return false; } $this->data[$id] = null; unset($this->data[$id]); return true; } }

转载于:https://www.cnblogs.com/wntd/p/8980862.html

PHP 设计模式系列 —— 资源库模式(Repository)相关推荐

  1. 设计模式系列——克隆模式

    设计模式系列--克隆模式 前言 native关键字 原型模式适用的场景 原型模式的应用 原型模式实战 浅克隆 深克隆 前言 在我们工作中经常能遇到大幅度使用get或set方法,例如下面这样的代码 pu ...

  2. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  3. 设计模式系列-创建者模式

    为什么80%的码农都做不了架构师?>>>    一.上篇回顾 上篇我们主要讲述了抽象工厂模式和工厂模式.并且分析了该模式的应用场景和一些优缺点,并且给出了一些实现的思路和方案,我们现 ...

  4. 设计模式系列-代理模式

    为什么80%的码农都做不了架构师?>>>    一.上篇回顾 很久没有更新设计模式系列的文章了,有了很多热心朋友的反馈,我决定继续将这个系列赶快写完,最近由于过年了,有很多相关的事宜 ...

  5. PHP设计模式系列 - 外观模式

    外观模式 通过在必需的逻辑和方法的集合前创建简单的外观接口,外观设计模式隐藏了调用对象的复杂性. 外观设计模式和建造者模式非常相似,建造者模式一般是简化对象的调用的复杂性,外观模式一般是简化含有很多逻 ...

  6. 策略模式和工厂模式的区别_设计模式系列 — 策略模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...

  7. 设计模式系列 - 解释器模式

    解释器模式通过实现一个表达式接口,从而能够以指定方式解析指定内容 介绍 解释器模式属于行为型模式,通过这种设计模式,我们可以定义一种特定的解释器来解释特定的业务场景,可以类比不同的编程语言的编译器需要 ...

  8. 设计模式系列-组合模式

    今天下班客厅的灯确实亮堂了许多,照照镜子感觉自己一下苍老许多,看来还是灯光暗比较好,看不出来自己的憔悴啊,哈哈,其实还是头发长了,决定出去剪发. 进到美发店,便有热情的服务生招呼,显示洗头,挑选造型师 ...

  9. 小米设计模式系列--proxy模式

    好久没更博了,因为最近忙着学h5和安卓,驱动只看了看wifi,这个就路漫漫其修远兮了,不知道得看到何年何月.决定把前段时间学的设计模式整理下,我是个米粉,曾一直想着去小米公司工作,不过最近买了一款红米 ...

最新文章

  1. 计算机语言中索引什么意思,算法索引
  2. metrics_将指标标签与MicroProfile Metrics 2.0结合使用
  3. mysql 转义字符 escape_mysql_real_escape_string转义字符串返回false?
  4. 【博客话题】我的2011项目总结
  5. 8.基本数据结构-顺序表和链表
  6. 总结4:input文本输入框自动提示
  7. HDU 3966 树链剖分后线段树维护
  8. create_proc_read_entry中函数的说名
  9. 网页无法调用java9_JAVA 9 (内部类,异常,包)
  10. docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例
  11. selenium ie 模拟request pahonjs
  12. 孤岛能源安卓游戏源码
  13. java 缓存队列_双缓冲队列的java实现
  14. 文字排版中的字号尺寸对照表(清晰、准确(含两个版本对比)、可复制)
  15. crash report for adobe photoshop cc 2019
  16. Python如何自动播放视频(XXT)
  17. 【亲测】服务器事件查看器打不开报错,mmc无法创建管理单元怎么办
  18. CentOS Linux自动备份文件按日期备份
  19. 让笔记本触摸板默认关闭
  20. [Android UI] graphics

热门文章

  1. vb破解万能断点816c24
  2. 书------编程(理论方面)
  3. 第一篇随笔,通常都是内容空洞的。
  4. 盘点8月的手工作品!
  5. asp2.0缓存概述
  6. 灰度图像--图像增强 双边滤波 Bilateral Filtering
  7. Popup窗口在XP+SP2下面受到限制
  8. 20.三层技术之OSPF区域划分与路由重分发(2)
  9. 打印数组算法:堆栈与深度优先搜索(迷宫问题)
  10. 快刀斩“乱码”,你需要这些套路!