美文网首页
设计模式学习(第十一章到第二十章)

设计模式学习(第十一章到第二十章)

作者: ZalleDay | 来源:发表于2019-05-13 20:42 被阅读0次

    第十一章 迪米特法则

    • 定义:如果两个类 不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果如果一个类需要调用另一个类的方法时,可以通过第三者转发调用。

    第十二章 外观模式

    • 定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这一子系统更加容易使用。

    • 结构图:


      image.png

    例子:
    定义一个股票系统,系统下有四只股票的类,股票类可以买股票和卖股票。股票系统有两个方法,一个是卖全部股票,一个买全部股票。这样你在客户端时只需要使用这个股票系统的两个方法就能得到你的结果。这样客户端和这个四支股票的相关性的降低了,四支股票的实现是就分别实现,我们根据这个股票系统的接口就可以直接使用股票的买卖。

    优点&缺点&应用

    1. 满足依赖倒转的原则,迪米特原则。
      2.对于一个老系统的维护,老系统已经比较难维护,设计粗糙或高度复杂,功能不易拆分,我们可以成立两个开发小组,一个建立一个facade的接口,用与老系统的交互,建立一个新的比较清晰与简单的接口。另一个小组在此接口的基础上增加新的功能。

    第十三章 建造者模式

    • 定义:将一个复杂对象的构建与他的表示分离,使得同样的构建可以创建不同的表示。

    结构图:


    image.png

    白话理解:有点类似于工厂模式,在具体哦的Builder中写好如何构建对象的逻辑(使用不同组件进行组装,例如没有组件就不通过),则这个BuilderA专门构建这个参数产品的工厂。然后使用的Director进行调用。这样一来就会得到一个通过严肃过程的对象,好处是部分的组装逻辑与部分的定义解耦。

    应用场景

    用于:当创建复杂对象的算法应该独立于与该对象的组成成分以及他们他们装配方式的场景下。

    第十四章 观察者模式

    • 定义: 定义了一种一对多的依赖关系,让对个观察者对象同时监听某一个主题对象。这个主题对象发生变化时,会通知所有观察者对象,使他们自己更新自己。

    机构图:


    结构图

    应用场景

    1. 对于一个系统的分割成一系列相互协作的类会产生一个问题,那就是维护相关对象的一致性。类相互在自己的类中写上与其他类的参数传递的话,这样违反封闭开发原则,并且每增加一个相关类都会引起维护。
    2. 放一个对象改变需要同时改变其他对象的时候
    3. 我们不知道有多少对象要改变的时候
    • 优点
      观察者模式的工作是解除耦合,让耦合双方都依赖与抽象,而不是依赖于具体,从而使得各自变化都不会影响另一边需要功能修改。
    • 缺点
      不是所有的通知后调用的方法名字都叫Update,可能是display啥的,所以对于有委托机制的语言可以做到弥补这个缺点,向Java没有此机制,可以使用反射机制实现委托机制。

    第十五章 抽象工厂模式

    • 定义:提供一个创建一系列相关或者相互依赖的对象的接口,无需指定他们具体的类。

    状态图:


    image.png
    • 优点:
    1. 对于要实例化的工厂,代码中出现一次,因此,我们改变实例化的另一个工厂也非常简单。
    2. 客户端的操作都是基于接口的,有利于对客户端与具体类的解耦。
    • 缺点
      对于这个图,每创建有一个产品,需要增加一个接口,两个具体类,还要增加工厂的方法,虽然不违背开放封闭原则,但是影响开发效率。

    使用简单工厂与反射对抽象工厂的升级

    状态图:


    简单工厂类的升级

    我们可以使用反射机制,把简单工厂类的判断逻辑(switch case)去除,这样我们得到的工厂还依旧符合我们的目标。对于客户端我们只需要DataAccrss类即可。还有对于我们要增加多一种产品,我们只需要增加一个接口类、两个具体类即可。

    例子如下:


    image.png
    • 对于db数据的名字我们可以卸载配置文件里面,易于修改。

    十六章 状态模式

    • 定义: 当一个对象的内在状态改变时,准许改变其行为,这个对象看起来像改变其类。
    状态图
    • 优点:
    1. 将特定状态局部化,把不同状态划分开来。
    2. 状态模式可以将各种状态的转移逻辑分布在各个子类,减少相互间的依赖。
    • 应用
      当一个对象的的行为取决于它的状态时,并且他更具运行时状态改变的行为,他就可以使用状态模式。

    第十七章 适配器模式

    • 定义:将一个类的接口转换为客户希望的另一个接口。Adapter模式使得原本接口不一致的而不能一起工作的类可以协同任务。
    适配器状态图

    解释:target是客户端知道的接口。 适配器需要去实现这个target的接口函数,然后调用Adeptee特殊接口的函数组合完成这个接口函数的功能。 最后,客户端只需要 Target target = new Adapter; 就可以协同任务了。

    • 应用
    1. 对于使用一个已经存在的类,但如果他的接口和你的要求不同时,但是两个类做的事情相似,而双方不太容易修改时,可以使用适配器模式

    2. 只能说使用适配器是不得已的补救措施,如果可以统一接口或者是扩展功能,我们在设计之初尽量做到这个两方面的考虑。

    第十八章 备忘录模式

    • 定义:在不破坏封装性的前提之下,捕获一个对象的内部状态,并在该对象之外保存这个状态,如此的话,我们就可以将该对象恢复至原先保存的状态。
    备忘录模式
    • 应用
      备忘录模式适用于功能比较复杂,但是要维护或者记录历史的类,或者是需要保存一部分属性的类。(例如:拥有撤销功能的类)

    第十九章 组合模式

    • 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单对象和组合对象的使用具有一致性。
    组合模式

    例子:


    公司例子

    菱形实线箭头是拥有的关系。

    • 优点
    1. 基本对象可以被组合成更复杂的对象,而这个对象又可以被组合,不断递归。
      2.用户只需要下一层结点的组装
      3.组合模式让用户不用以叶节点还是组件结点来看待对象,一致使用接口即可。

    第二十章 迭代器

    • 定义:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。
    迭代器模式

    虚线箭头是依赖关系,实现是关联关系。
    例子:


    具体的迭代器 具体的集合类
    • 优点:
      迭代器模式就是分离集合对象的遍历行为, 抽象出一个迭代器负责,做到不暴露内部结构,又能透明化访问集合内部数据。

    java的反射相关知识:
    参考博客

    相关文章

      网友评论

          本文标题:设计模式学习(第十一章到第二十章)

          本文链接:https://www.haomeiwen.com/subject/tvdxaqtx.html