14.剩下的模式

桥接

使用桥接模式(Bridge Pattern)不只改变你的实现,也改变你的抽象。

桥接的优点:

  • 将实现予以解耦,让它和界面之间不再永久绑定。
  • 抽象和实现可以独立扩展,不会影响到对方。
  • 对于“具体的抽象类”所做的改变,不会影响到客户。

桥接的用途和缺点:

  • 适合使用在需要跨越多个平台的图形和窗口系统上。
  • 当需要用不同的方式改变接口和实现时,你会发现桥接模式很好用。
  • 桥接模式的缺点是增加了复杂度。

生成器

使用生成器模式(Builder Pattern)封装一个产品的构造过程,并允许按步骤构造。

生成器的优点:

  • 将一个复杂对象的创建过程封装起来
  • 允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同)
  • 向客户隐藏产品内部的表现
  • 产品的实现可以被替换,因为客户只看到一个抽象的接口

生成器的用途和缺点:

  • 经常被用来创建组合结构
  • 与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。

责任链

当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式(Chain of Responsibility Pattern)。

责任链的优点:

  • 将请求的发送者和接受者解耦。
  • 可以简化你的对象,因为它不需要知道链的结构。
  • 通过改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任。

责任链的用途和缺点:

  • 经常被使用在窗口系统中,处理鼠标和键盘之类的时间。
  • 并不保证请求一定会被执行;如果没有任何对象处理它的话,它可能会落到链尾端之外。
  • 可能不容易观察运行时的特征,有碍于除错。

蝇量

如想让某个类的一个实例能用来提供许多“虚拟实例”,就使用蝇量模式(Flyweight Pattern)。

蝇量的优点:

  • 减少运行时对象实例的个数,节省内存。
  • 将许多“虚拟”对象的状态集中管理。

蝇量的用途和缺点:

  • 当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用蝇量模式。
  • 蝇量模式的缺点在于,一旦你实现了它,那么单个的逻辑实例将无法拥有独立而不同的行为。

解释器

使用解释器模式(Interpreter Pattern)为语言创建解释器。

解释器模式的优点:

  • 将每一个语法规则表示成一个类,方便于实现语言。
  • 因为语法由许多类表示,所以你可以轻易地改变或扩展此语言。
  • 通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证。

解释器的用途和缺点:

  • 当你需要实现一个简单的语言时,使用解释器。
  • 当你有一个简单的语法,而且简单比效率更重要时,使用解释器。
  • 可以处理脚本语言和编程语言。
  • 当语法规则的数目太大时,这个模式可能会变得非常繁杂。在这种情况下,使用解析器/编译器的产生器可能更合适。

中介者

使用中介者模式(Mediator Pattern)来集中相关对象之间复杂的沟通和控制方式。

中介者的优点:

  • 通过将对象彼此解耦,可以增加对象的复用性。
  • 通过将控制逻辑集中,可以简化系统维护。
  • 可以让对象之间所传递的消息变得简单而且大幅减少。

中介者的用途和缺点:

  • 中介者常常被用来协调相关的GUI组件。
  • 中介者模式的缺点是,如果设计不当,中介者对象本身会变得过于复杂。

备忘录

当你需要让对象返回之前的状态时(例如,撤销),就使用备忘录模式(Memento Pattern)。

备忘录的优点:

  • 将被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚。
  • 保持关键对象的数据封装。
  • 提供了容易实现的恢复能力。

备忘录的用途和缺点:

  • 备忘录用于储存状态。
  • 使用备忘录的缺点:储存和恢复状态的过程可能相当耗时。
  • 在Java系统中,其实可以考虑使用序列化机制储存系统的状态。

原型

当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式(Prototype Pattern)。

原型的优点:

  • 向客户隐藏制造新实例的复杂性
  • 提供让客户能够产生未知类型对象的选项
  • 在某些环境下,复制对象比创建新对象更有效。

原型的用途和缺点:

  • 在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型。
  • 使用原型模式的缺点:对象的复制有时相当复杂。

访问者

当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式。访问者必须参观组合内的每个元素;这样的功能是在导游(Traverser)对象中,访问者通过导游的引导,收集组合中所有对象的状态。一旦状态被收集了,客户就可以让访问者对状态进行各种操作。当需要新的功能时,只要加强访问者即可。

访问者的优点:

  • 允许你对组合结构加入新的操作,而无需改变结构本身。
  • 想要加入新的操作,相对容易。
  • 访问者所进行的操作,其代码是集中在一起的。

访问者的用途和缺点:

  • 当采用访问者模式的时候,就会打破组合类的封装。
  • 因为游走的功能牵涉其中,所以对组合结构的改变就更加困难。

results matching ""

    No results matching ""