桥接模式(Bridge)
使用桥接模式不只改变你的实现,也改变你的抽象。桥接模式通过将实现和抽象放在两个不同的类层次中而使它们可以独立改变。
桥接的优点:
-将实现予以解耦,让它和界面之间不再永久绑定。
-抽象和实现可以独立扩展,不会影响到对方。
-对于“具体的抽象类”所做的改变,不会影响到客户。
桥接的用途和缺点:
-适合使用在需要跨越多个平台的图形和窗口系统上。
-当需要用不同的方法改变接口和实现时,你会发现桥接模式很好用。
-桥接模式的缺点是增加了复杂度。
示例:控制器与界面各自的抽象
生成器模式(Builder)
-使用生成器模式封装一个产品的构造过程,并允许按步骤构造。
生成器的优点:
-将一个复杂对象的创建过程封装起来。
-允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工程模式不同)。
-向客户隐藏产品内部的实现。
-产品的实现可以被替换,因为客户只看到一个抽象的接口。
生成器的用途和缺点:
-经常被用来创建组合结构
-与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。
示例:度假计划
责任链模式(Chain of responsibility)
当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。
责任链模式的优点:
-将请求的发送者和接受者解耦
-可以简化你的对象,因为它不需要知道链的结构
-通过改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任
责任链的用途与缺点:
-经常被使用在窗口系统中,处理鼠标和键盘之类的事件
-并不保证请求一定会被执行;如果没有任何对象处理它的话,它可能会落到链尾之外(这可以是优点也可以是缺点)
-可能不容易观察运行时的特征,有碍于除错
示例:不同邮件(垃圾邮件,Fans邮件,客服邮件,业务邮件等)的处理
享元模式(Flyweight)
如想让某个类的一个实例能用来提供许多“虚拟实例”,就是用享元模式
享元模式的优点:
-减少运行时对象实例的个数,节省内存
-将许多“虚拟对象”的状态集中管理
享元模式的用途与缺点:
-当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用享元模式
-缺点:一旦你实现了它,那么单个的逻辑实例将无法拥有独立而不同的处理
享元模式
示例:景观设计中的点缀树的显示(只一个树实例,共享位置年轮信息)
解释器模式(Intepreter)
使用解释器模式为语言创建解释器
解释器的优点:
-将每一个语法规则表示成一个类,方便于实现语言
-因为语法由许多类表示,所以你可以轻易地改变或扩展此语言
-通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证
解释器的用途与缺点:
-当你需要实现一个简单的语言时,使用解释器
-当你有一个简单的语法,而且简单比效率更重要时,使用解释器
-可以处理脚本语言和编程语言
-当语言规则的数码太大时,这个模式可能会变得相当繁杂,在这种情况下,使用解释器/编译器的产生器可能更合适
示例:Duck pond控制鸭子的语言解释器
中介者模式(Mediator)
使用中介者模式来集中相关对象之间复杂的沟通和控制方式。每个对象都会在自己的状态改变时,告诉中介者,每个对象都会对中介者所发出的请求作出反应。中介者内包含了整个系统的控制逻辑。当某个对象需要一个新的规则时,或者是一个新的对象被加入系统内,其所有需要用到的逻辑也都被加入中介者内。
中介者模式的优点:
-通过将对象彼此解耦,可以增加对象的复用性
-通过将控制逻辑集中,可以简化系统维护
-可以让对象之间所传递的消息变得简单而且大幅减少
中介者模式的用途和缺点:
-中介者模式常常被用来协调相关的GUI组件
-中介者模式的缺点是:如果设计不当,中介者对象本身会变得过于复杂
示例:生活自动机(闹铃,煮咖啡,日历,喷头)
备忘录模式(Memento)
当你需要让对象返回之前的状态时(例如:undo),就使用备忘录模式。备忘录模式有两个目标:储存系统关键对象的重要状态;维护关键对象的封装。请不要忘记单一责任原则,不要把保持状态的工作和关键对象混在一起,这样比较好。这个专门掌握状态的对象就称为备忘录。
备忘录模式的优点:
-被储存的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚
-保持关节对象的数据封装
-提供了容易实现的恢复能力
备忘录模式的用途和缺点:
-备忘录用于储存状态
-使用备忘录的缺点:储存和恢复状态的过程可能相当耗时
-在Java系统中,其实可以考虑使用序列化(Serialization)机制储存系统的状态
示例:游戏中的存储进度功能
原型模式(Prototype)
当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式。原型模式允许你通过使用复制现有的实例来创建新的实例(在Java中,这通常意味着使用clone()方法或者反序列化)。这个模式的重点在于,客户的代码在不知道要实例化何种特定类的情况下,可以制造出新的实例。
原型模式的优点:
-向客户隐藏制造新实例的复杂性
-提供客户能够产生未知类型对象的选项
-在某些环境下,复制对象比创建新对象更有效
原型模式的用途和缺点:
-在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型
-缺点:对象的复制有时相当复杂
示例:在游戏中创建各式各样的怪兽
访问者模式(Visitor)
当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式。
客户要求访问者从组合结构中取得信息,新方法可以被加入到访问者中,而不会影响组合;访问者需要能够调用组合类的getState(),而这也正是你能够加入新方法以让客户使用的地方;所有的这些组合类必须做的事情就是加入一个getState()方法,而不必担心暴露他们自己。
访问者模式的优点:
-允许你对组合结构加入新的操作,而不需改变结构本身
-想要加入新的操作,相对容易
-访问者所进行的操作,其代码是集中在一起的
访问者模式的用途和缺点:
-当采用访问者模式的时候,就会打破组合类的封装
-因为游走的功能牵涉其中,所以对组合结构的改变就更加困难
示例:对乡村餐厅的菜单添加营养成分,能量显示