1. 单例模式Singleton:依赖注入容器+服务定位实现组件单例
yiiwebApplication extends yiiaseModule extends yiidiServiceLocator
获取组件时实际会经由yiidiServiceLocator::get(),而yiidiServiceLocator维护着$_components和$_defenitions,若$_components中已有所需组件实例则不再重复实例化;否则从Yii::createObject()=>yiidiContainer::get()实例化所需对象及其所有依赖。
同时yiidiContainer维护者一个$_singletons数组,存储被显示定义为单例的对象。
依赖注入Dependency Injection:yiidiContainer 实例化一个对象与其所有的依赖
服务定位Service Locator:yiidiServiceLocator $_definitions $_components set() get() ==> Yii::createObject() ==> yiidiContainer::get() | yiidiContainer::invoke()
2. 迭代器模式(Iterator):提供方便的遍历对象的方法,而无需暴漏对象内部结构。
yiiaseModel implements IteratorAggregate,ArrayAccess,Arrayable
getIterator() ==> return new ArrayIterator($model->getAttributes())
3. 适配器模式(Adapter)
适配器模式的优点是既没有修改原来的类,又扩展了原来的类, 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
(1) yiimutexDbMutex扩展了yiimutexMutex,使得yiimutexMutex可以在数据库锁应用中得到复用,同时解决了yiimutexMysqlMutex等数据库锁应用需要的附加信息。
4. 建造者模式(Builder)
建造者模式也称生成器模式,核心思想是将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
产品角色,抽象构造者角色,具体构造者角色,导演角色
(1) yiidbQuery导演角色,产品角色[$sql,$params],具体构造者角色yiidbmysqlQueryBuilder extends yiidbQueryBuilder抽象构造者角色,buildJoin(),buildSelect(),buildWhere(),buildFrom()等方法用于构造sql语句的各个组成部分。
5. 装饰模式(Decorator)
抽象构件角色,具体构件角色,抽象装饰器角色,具体装饰器角色
(不确定?)yiiwebController::render()在指定视图基础上增加布局视图的渲染
6. 代理模式(Proxy)
yiilogDispatcher与yiilogTarget;分发器将日志分发到各个target,各自以不同的方式处理感兴趣的日志级别。
7. 观察者模式(Observer)
(1) 日志分发机制:yiilogDispatcher与多种多样的log target;日志分发器注册了多种日志目标处理器,分发日志时依次调用各个目标处理器的日志收集方法。
(2) 事件机制:yiiaseComponent::on注册实例级别事件handler,yiiaseEvent::on注册类级别的事件handler,事件触发时依次调用与对应事件关联的事件handler。
8. 模板方法模式(Template Method)
模板方法使用继承来改变算法的部分,策略模式使用委托来改变整个算法。区别在于封闭的变化不同,模板方法模式变化的是部分,策略模式变化的是整体
(1) yiilogTarget与具体log target类:yiilogFileTarget,yiilogDbTarget,yiilogEmailTarget等;
(2) yiicachingCache与具体cache类:;
(3) yiimutexMutex与具体锁实现类:yiimutexFileMutex,yiimutexDbMutex
9. 策略模式(Strategy)
(1)缓存接口yiicachingCacheInterface,基于这个接口的不同实现变化的是整体缓存策略,例如缓存策略基类yiicachingCache,而不同的具体缓存行为yiicachingFileCache,yiicachingApcCache,yii edisCache等变化的是yiicachingCache的部分行为,所以Yii缓存的实现更像是策略模式与模板方法模式的结合体。
10. 门面模式(Facade)
为一些复杂的子系统提供一组统一的接口,提高子系统的独立性,实现客户端与子系统的松耦合。
(1) yiidbActiveQuery提供的一系列查询相关的方法:one() all() scalar() joinWith() with() via() inverseOf()等,隐藏了内部Connection,Command,QueryBuilder等复杂的数据连接与查询处理过程。
(2) yiiwebApplication作为全局唯一的应用实例,可以看作是内部复杂组件的门面,Yii::$app的init() bootstrap() run()等方法负责组织内部复杂组件的初始化过程,以及请求处理的各阶段流程。