zoukankan      html  css  js  c++  java
  • Yii2 设计模式初探

    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()等方法负责组织内部复杂组件的初始化过程,以及请求处理的各阶段流程。

  • 相关阅读:
    ABAP接口用法
    监听textarea数值变化
    The first step in solving any problem is recognizing there is one.
    Wrinkles should merely indicate where smiles have been.
    God made relatives.Thank God we can choose our friends.
    Home is where your heart is
    ABAP跳转屏幕
    Python 工具包 werkzeug 初探
    atom通过remote ftp同步本地文件到远程主机的方法
    Mongodb学习笔记一
  • 原文地址:https://www.cnblogs.com/ling-diary/p/9657658.html
Copyright © 2011-2022 走看看