Yii2 设计模式初探

1. 单例模式Singleton:依赖注入容器+服务定位实现组件单例

yii\web\Application extends yii\base\Module extends yii\di\ServiceLocator
获取组件时实际会经由yii\di\ServiceLocator::get(),而yii\di\ServiceLocator维护着$_components和$_defenitions,若$_components中已有所需组件实例则不再重复实例化;否则从Yii::createObject()=>yii\di\Container::get()实例化所需对象及其所有依赖。
同时yii\di\Container维护者一个$_singletons数组,存储被显示定义为单例的对象。

依赖注入Dependency Injection:yii\di\Container 实例化一个对象与其所有的依赖
服务定位Service Locator:yii\di\ServiceLocator $_definitions $_components set() get() ==> Yii::createObject() ==> yii\di\Container::get() | yii\di\Container::invoke()

2. 迭代器模式(Iterator):提供方便的遍历对象的方法,而无需暴漏对象内部结构。

yii\base\Model implements IteratorAggregate,ArrayAccess,Arrayable

getIterator() ==> return new ArrayIterator($model->getAttributes())

3. 适配器模式(Adapter)

适配器模式的优点是既没有修改原来的类,又扩展了原来的类, 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
(1) yii\mutex\DbMutex扩展了yii\mutex\Mutex,使得yii\mutex\Mutex可以在数据库锁应用中得到复用,同时解决了yii\mutex\MysqlMutex等数据库锁应用需要的附加信息。

4. 建造者模式(Builder)

建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
产品角色,抽象构造者角色,具体构造者角色,导演角色
(1) yii\db\Query导演角色,产品角色[$sql,$params],具体构造者角色yii\db\mysql\QueryBuilder extends yii\db\QueryBuilder抽象构造者角色,buildJoin(),buildSelect(),buildWhere(),buildFrom()等方法用于构造sql语句的各个组成部分。

5. 装饰模式(Decorator)

抽象构件角色,具体构件角色,抽象装饰器角色,具体装饰器角色

(不确定?)yii\web\Controller::render()在指定视图基础上增加布局视图的渲染

6. 代理模式(Proxy)
yii\log\Dispatcher与yii\logTarget;分发器将日志分发到各个target,各自以不同的方式处理感兴趣的日志级别。

7. 观察者模式(Observer)

(1) 日志分发机制:yii\log\Dispatcher与多种多样的log target;日志分发器注册了多种日志目标处理器,分发日志时依次调用各个目标处理器的日志收集方法。
(2) 事件机制:yii\base\Component::on注册实例级别事件handler,yii\base\Event::on注册类级别的事件handler,事件触发时依次调用与对应事件关联的事件handler。

8. 模板方法模式(Template Method)

模板方法使用继承来改变算法的部分,策略模式使用委托来改变整个算法。区别在于封闭的变化不同,模板方法模式变化的是部分,策略模式变化的是整体
(1) yii\log\Target与具体log target类:yii\log\FileTarget,yii\log\DbTarget,yii\log\EmailTarget等;
(2) yii\caching\Cache与具体cache类:;
(3) yii\mutex\Mutex与具体锁实现类:yii\mutex\FileMutex,yii\mutex\DbMutex

9. 策略模式(Strategy)

(1)缓存接口yii\caching\CacheInterface,基于这个接口的不同实现变化的是整体缓存策略,例如缓存策略基类yii\caching\Cache,而不同的具体缓存行为yii\caching\FileCache,yii\caching\ApcCache,yii\redis\Cache等变化的是yii\caching\Cache的部分行为,所以Yii缓存的实现更像是策略模式与模板方法模式的结合体。

10. 门面模式(Facade)

为一些复杂的子系统提供一组统一的接口,提高子系统的独立性,实现客户端与子系统的松耦合。
(1) yii\db\ActiveQuery提供的一系列查询相关的方法:one() all() scalar() joinWith() with() via() inverseOf()等,隐藏了内部Connection,Command,QueryBuilder等复杂的数据连接与查询处理过程。

(2) yii\web\Application作为全局唯一的应用实例,可以看作是内部复杂组件的门面,Yii::$app的init() bootstrap() run()等方法负责组织内部复杂组件的初始化过程,以及请求处理的各阶段流程。

猜你喜欢

转载自www.cnblogs.com/ling-diary/p/9657658.html
今日推荐