设计模式
设计模式简介
看懂UML类图和时序图
UML统一建模语言
UML类图及类图之间的关系
类关系记忆技巧
如何正确使用设计模式
优秀设计的特征
面向对象设计原则
创建型设计模式
工厂模式
抽象工厂模式
简单工厂模式
静态工厂模式(Static Factory)
单例模式
建造者模式
原型模式
结构型设计模式
适配器模式
桥接模式
组合模式
装饰器模式
外观模式
享元模式
代理模式
过滤器模式
注册模式(Registry)
行为型设计模式
责任链模式
命令模式
解释器模式
中介者模式
备忘录模式
迭代器模式
观察者模式
状态模式
策略模式
模板模式
访问者模式
规格模式(Specification)
J2EE 设计模式
MVC 模式
业务代表模式
组合实体模式
数据访问对象模式(DAO模式)
前端控制器模式
拦截过滤器模式
空对象模式
服务定位器模式
传输对象模式
数据映射模式(Data Mapper)
依赖注入模式(Dependency Injection)
流接口模式(Fluent Interface)
其他模式
对象池模式(Pool)
委托模式
资源库模式(Repository)
实体属性值模式(EAV 模式)
反面模式
归纳设计模式
本文档使用 MrDoc 发布
-
+
首页
资源库模式(Repository)
## 目的 该模式通过提供集合风格的接口来访问领域对象,从而协调领域和数据映射层。 资料库模式封装了一组存储在数据存储器里的对象和操作它们的方法,这样为数据持久化层提供了更加面向对象的视角。资料库模式同时也达到了领域层与数据映射层之间清晰分离,单向依赖的目的。 ## 例子 * Doctrine 2 ORM: 通过资料库协调实体和 DBAL,它包含检索对象的方法。 * Laravel 框架 ## UML ![资源库模式](/media/202203/2022-03-29_2215520.1387221933453915.png) ## 示例代码 ### PHP ```php class Post { /** * @var int|null */ private $id; /** * @var string */ private $title; /** * @var string */ private $text; public static function fromState(array $state): Post { return new self( $state['id'], $state['title'], $state['text'] ); } /** * @param int|null $id * @param string $text * @param string $title */ public function __construct($id, string $title, string $text) { $this->id = $id; $this->text = $text; $this->title = $title; } public function setId(int $id) { $this->id = $id; } public function getId(): int { return $this->id; } public function getText(): string { return $this->text; } public function getTitle(): string { return $this->title; } } /** * 这个类位于实体层(Post 类)和访问对象层(内存)之间。 * * 资源库封装了存储在数据存储中的对象集以及他们的操作执行 * 为持久层提供更加面向对象的视图 * * 在域和数据映射层之间,资源库还支持实现完全分离和单向依赖的目标。 * */ class PostRepository { /** * @var MemoryStorage */ private $persistence; public function __construct(MemoryStorage $persistence) { $this->persistence = $persistence; } public function findById(int $id): Post { $arrayData = $this->persistence->retrieve($id); if (is_null($arrayData)) { throw new \InvalidArgumentException(sprintf('Post with ID %d does not exist', $id)); } return Post::fromState($arrayData); } public function save(Post $post) { $id = $this->persistence->persist([ 'text' => $post->getText(), 'title' => $post->getTitle(), ]); $post->setId($id); } } class MemoryStorage { /** * @var array */ private $data = []; /** * @var int */ private $lastId = 0; public function persist(array $data): int { $this->lastId++; $data['id'] = $this->lastId; $this->data[$this->lastId] = $data; return $this->lastId; } public function retrieve(int $id): array { if (!isset($this->data[$id])) { throw new \OutOfRangeException(sprintf('No data found for ID %d', $id)); } return $this->data[$id]; } public function delete(int $id) { if (!isset($this->data[$id])) { throw new \OutOfRangeException(sprintf('No data found for ID %d', $id)); } unset($this->data[$id]); } } class RepositoryTest extends TestCase { public function testCanPersistAndFindPost() { $repository = new PostRepository(new MemoryStorage()); $post = new Post(null, 'Repository Pattern', 'Design Patterns PHP'); $repository->save($post); $this->assertEquals(1, $post->getId()); $this->assertEquals($post->getId(), $repository->findById(1)->getId()); } } ```
追风者
2022年3月29日 22:23
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码