18.解释器模式:定义一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。【DP】
如果一种特定类型的问题发生的频率足够高,那么就可以考虑将该问题的各个实例表述为一个简单语言中的句子。也就是说,通过构建一个解释器,该解释器解释这些句子来解决该问题【DP】。
19.中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。【DP】。
面向对象设计鼓励将行为分布到各个对象中,这种分布可能会导致对象间有许多连接。也就是说,有可能每一个对象都需要知道其他许多对象。对象间的大量相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作,这对于应对变化是不利的,任何较大的改动都很困难【DP】
将集体行为封装一个单独的中介者对象来避免这个问题,中介者负责控制和协调一组对象间的交互。中介者充当一个中介以使组中的对象不再相互显示引用。这些对象仅知道中介者,从而减少了相互连接的数目【DP】。
最少知识原则,(迪米特法则),也就是如何减少耦合的问题,类之间的耦合越弱,越有利于复用【J&DP】。
20.访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。【DP】
访问者增加具体的Element是困难的,但增加依赖于复杂对象结构的构件的操作就变得容易。仅需增加一个新的访问者即可在一个对象结构上定义一个新的操作。
21.策略模式:定义一系列的算法,把它们一个个封装起来,并且使他们可以互相替换。本模式使得算法可以独立于使用它的客户而变化。【DP】
继承提供了一种支持多种算法或行为的方法,我们可以直接生成一个类A的子类B、C、D,从而给它以不同的行为。但这样会将行为硬行编制到父类A当中,而将算法的实现与类A的实现混合起来,从而使得类A难以理解、难以维护和难以扩展,而且还不能动态地改变算法。仔细分析会发现,他们之间的唯一差别是它们所使用的算法或行为,将算法封装在独立的策略Strategy类中使得你可以独立于其基类A改变它,使它易于切换、易于理解、易于扩展【DP】
22.备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。【DP】
可以避免暴露一些只应由对象A管理却又必须存储在对象A之外的信息。备忘录模式把可能很复杂的对象A的内部信息对其他对象屏蔽起来,从而保持了封装边界【DP】
23.迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素,而又不需要暴露该对象的内部表示。【DP】
迭代器模式的关键思想是将对列表的访问和遍历从列表对象中分离出来放入一个迭代器对象中,迭代器类定义了一个访问该元素的接口。迭代器对象负责跟踪当前的元素,并且知道哪些元素已经遍历过了【DP】
只要是在做面向对象的开发,创建对象时,负责创建的实体通常需要了解要创建的是哪个具体的对象,以及何时创建这个而非那个对象的规则。而我们如果希望遵循开放闭合原则、依赖倒转原则和里氏代换原则,那使用对象时,就不应该知道所用的是哪一个特选的对象。此时就需要‘对象管理者’工厂来负责此事【DPE】。
在创建对象时,使用抽象工厂、原型、建造者的设计比使用工厂方法要更灵活,但它们也更加复杂,通常,设计是以使用工厂方法开始,当设计者发现需要更大的灵活性时,设计便会向其他创建型模式演化【DP】。
工厂方法的实现并不能减少工作量,但是它能够在必须处理新情况时,避免使已经很复杂的代码更加复杂【DPE】。
面向对象设计模式体现的就是抽象思想,类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象