“模”法无边-设计模式5

2019-04-14 14:42发布

  1. 模板方法模式
    1. 定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。
    1. 将整体框架写在父类代码中,具体的细节调用子类的方法实现,这里运用了多态
   
  1. 外观模式
    1. 一组方法的集合
    2. 高层接口的方法同时调用低层接口的多个方法
    3. 客户端调用的时候只调用高层接口的方法
 
  1. 建造者模式
    1. 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    1. 将一个建造过程利用类的封装,将其分离,当建造这个产品时,只需要调用这个封装类即可,再由这个封装类的过程中的方法调用具体类的实现方法。
 
  1. 观察者模式
    1. 解耦实战一
      1. 由于观察者和被观察者之间存在耦合,所以为具体的观察者定义抽象类,针对抽象编程,针对抽象编程,减少了与具体类的耦合(将所有与具体观察者耦合的地方都改成了'抽象观察者')
    1. 解耦实战二
      1. 由于具体具体观察者与具体的通知者耦合,所以也应该对具体通知者进行抽象。
    1. 观察者和通知者之间都是通过抽象类进行联系的,这里用到了多态和继承
    1. 这里用到的方法有Attach(增加观察者)和Detach(减少观察者),
    1. 事件委托实现
      1. 将看NBA的关闭NBA方法和看股票者的关闭股票的方法委托给boss,可以将多个同事的更新方法委托给他,
      1. 实现了观察者和通知者的完全解耦合.
 
  1. 状态模式
    1. 将状态引起的行为封装,根据具体的状态,调用具体状态的方法。
 
  1. 适配器模式VS代理模式VS命令模式
    1. 代理模式
      1. 代理者和被代理者拥有相同的方法和属性
      1. 被代理者是代理者的一个成员
      1. 代理者调用被代理者的方法(方法的嵌套调用)
    1. 适配器模式
      1. 被适配器是适配器的成员
      1. 适配器的方法调用被适配器的方法(方法的嵌套调用)
      2. 用户调用适配器的方法
    1. 命令模式(方法的嵌套调用)
      1. 接受者是命令的成员,命令是Invoker的成员
      1. Invoker调用命令的执行方法
      1. 命令的执行方法调用命令执行者的动作。
 
  1. 备忘录模式
    1. 需要备忘者拥有一个备忘录
    1. 需要备忘者有权决定将那些信息存储到备忘录中
    1. 备忘录允许备忘者任何时刻得到备忘录中的信息
    1. 管理备忘录的人无权得到信息,但可以传递备忘录
 
  1. 组合模式
    1. 利用显示方法使得一层与下一层具有级与级的关系(树形结构)
    1. 透明方式和安全方式
      1. 透明方式
        1. 无论是叶节点还是枝节点都有实现自己下一级的方法,但是,叶节点的方法没有意义.
      1. 枝节点具有实现自己下一级的方法,叶节点没有,客户端调用需作出判断.
 
  1. 迭代器模式
    1. 具体迭代器,利用 Frst() ,Next(),IsDone(),CurrentItem(),4个方法定义一个对聚集对象的遍历顺序
    1. .Net的迭代器实现
      1. foreach隐式调用IeumeratorMoveNext()方法和IEnumerableGetEnumerator()实现迭代
    1. Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器来负责,这样既可以不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
 
  1. 单例模式
    1. 一个类只有一个实例
    1. 保证方法
      1. 判断对象是否为Null
      2. 判断对象是否显示在界面上(Disposed
      3. 自己有没有被实例化只有自己知道-构造函数私有化,从内部访问构造函数
    1. 多线程时的单例
      1. 单重锁定
        1. 对判断是否实例化的过程和创建过程加锁,对有一个线程正在执行判断过程时,其它线程不能执行此判断和创建过程。
      1. 双重锁定
        1. 对实例化的过程加锁,只有当实例化对象为空时,才允许执行实例化的过程。
        2. 这时,需要做两次实例化对象是否为空的判断,以防止两个线程,都经过了第一层检验进入了创建过程的锁区,如果都进入了仍进行一次判断是否为空,为空才进行实例化过程。
    1. 静态初始化
      1. 懒汉式自己被加载时就将自己实例化
      1. 饿汉式第一次被引用时,才将自己实例化。
 
  1. 桥接模式
    1. 实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
    2. 定义抽象类之间的关系
 
  1. 职责链模式
    1. 请求被层层递近,直到被解决。
 
  1. 中介者模式VS迪米特法则
    1. 中介者模式
      1. 中介者包含两个通信者类,然后有送信方法
      1. 通信者含有收到消息并应对的方法
    1. 迪米特法则
 
  1. 享元模式
    1. Flyweight工厂利用构造函数先实例化3个对象
    1. 根据客户需求返回早已生成好的对象,或者根据运行时再实例化为具体的对象
    1. 客户端调用具体对象的方法。       
   
  1. 解释器模式
    1. 将客户输入的数据转换成机器可执行的语言
 
  1. 访问者模式
    1. 访问者模式适用于数据结构相对稳定的系统:人类只分为男人和女人
    1. 他把数据结构和数据结构上的操作之间的耦合解脱开:男人和女人恋爱,结婚,成功,失败分别有不同的状态。
  1. UML图与大话设计,C#代码实现
    1. 泛化:继承
    1. 实现:类继承接口,实现接口的所有特征和行为。
    1. 关联:成员变量
    2. 聚合:成员变量
    3. 组合:成员变量
    1. 依赖:局部变量、方法的参数或者对静态方法的调用
    1. 各种关系造成类之间的耦合度由高到低一次是:泛化(类之间的继承)=实现(类继承接口)>组合(成员变量)>聚合(成员变量)>关联(一个类调用另一个类的方法)>依赖(方法参数的调用)