设计模式
设计模式简介
看懂UML类图和时序图
UML统一建模语言
UML类图及类图之间的关系
类关系记忆技巧
如何正确使用设计模式
优秀设计的特征
面向对象设计原则
创建型设计模式
工厂模式
抽象工厂模式
简单工厂模式
静态工厂模式(Static Factory)
单例模式
建造者模式
原型模式
结构型设计模式
适配器模式
桥接模式
组合模式
装饰器模式
外观模式
享元模式
代理模式
过滤器模式
注册模式(Registry)
行为型设计模式
责任链模式
命令模式
解释器模式
中介者模式
备忘录模式
迭代器模式
观察者模式
状态模式
策略模式
模板模式
访问者模式
规格模式(Specification)
J2EE 设计模式
MVC 模式
业务代表模式
组合实体模式
数据访问对象模式(DAO模式)
前端控制器模式
拦截过滤器模式
空对象模式
服务定位器模式
传输对象模式
数据映射模式(Data Mapper)
依赖注入模式(Dependency Injection)
流接口模式(Fluent Interface)
其他模式
对象池模式(Pool)
委托模式
资源库模式(Repository)
实体属性值模式(EAV 模式)
反面模式
归纳设计模式
本文档使用 MrDoc 发布
-
+
首页
注册模式(Registry)
> 存储在应用程序中经常使用的对象实例。 ## 目的 目的是能够存储在应用程序中经常使用的对象实例,通常会使用只有静态方法的抽象类来实现(或使用单例模式)。需要注意的是这里可能会引入全局的状态,我们需要使用依赖注入来避免它。 ## 例子 - Zend 框架 :Zend_Registry 实现了整个应用程序的 logger 对象和前端控制器等。 - Yii 框架:CWebApplication 具有全部应用程序组件,例如 CWebUser,CUrlManager 等。 ## 示例代码 ### PHP ```php /** * 创建注册表抽象类。 */ abstract class Registry { const LOGGER = 'logger'; /** * 这里将在你的应用中引入全局状态,但是不可以被模拟测试。 * 因此被视作一种反抗模式!使用依赖注入进行替换! * * @var array * 定义存储值数组。 */ private static $storedValues = []; /** * @var array * 定义合法键名数组。 * 可在此定义用户名唯一性。 */ private static $allowedKeys = [ self::LOGGER, ]; /** * @param string $key * @param mixed $value * * @return void * 设置键值,并保存进 $storedValues 。 * 可视作设置密码。 */ public static function set(string $key, $value) { if (!in_array($key, self::$allowedKeys)) { throw new \InvalidArgumentException('Invalid key given'); } self::$storedValues[$key] = $value; } /** * @param string $key * * @return mixed * 定义获取方法,获取已存储的对应键的值 * 可视作验证用户环节,检查用户名是否存在,返回密码,后续验证密码正确性。 */ public static function get(string $key) { if (!in_array($key, self::$allowedKeys) || !isset(self::$storedValues[$key])) { throw new \InvalidArgumentException('Invalid key given'); } return self::$storedValues[$key]; } } /** * 创建自动化测试单元。 */ class RegistryTest extends TestCase { public function testSetAndGetLogger() { $key = Registry::LOGGER; $logger = new stdClass(); Registry::set($key, $logger); $storedLogger = Registry::get($key); $this->assertSame($logger, $storedLogger); $this->assertInstanceOf(stdClass::class, $storedLogger); } /** * @expectedException \InvalidArgumentException */ public function testThrowsExceptionWhenTryingToSetInvalidKey() { Registry::set('foobar', new stdClass()); } /** * 注 @在此运行隔离进程:没有它的话,前一个测试单元可能已经设置它, * 并且测试将不能运行,这就是为什么你应该实现依赖注入, * 因为注入类会很容易被测试单元替代。 * * @runInSeparateProcess * @expectedException \InvalidArgumentException */ public function testThrowsExceptionWhenTryingToGetNotSetKey() { Registry::get(Registry::LOGGER); } } ```
追风者
2022年3月29日 19:55
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码