设计模式:
-
**设计模式的要素:**设计模式的核心在于提供了相关问题的解决方案,使人们可以更加简单方便地复用成功的设计和体系结构。设计模式的四个基本要素为:模式名称;问题;解决方案;效果。
-
创建型设计模式: 创建型设计模式是实例化过程进行抽象化,以使一个系统可以从创建,组合和表示对象的过程中独立出来。一个类的创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。创建型设计模式的基本要素有:抽象工厂(Abstract Factory); 生成器(Builder);工厂方法(Factory Method);原型(Prototype);单例(Singleton)。
-
结构型设计模式: 结构型设计模式的基本要素为:适配器(Adapter);桥接(Bridge);组合(Composite);装饰(Decorator);外观(Facade);享元(Flyweight);代理(Proxy)。
-
行为设计模式: 行为设计模式涉及算法和对象间职责的分配。行为设计模式不仅描述对象或类的行为模式,还描述了它们之间的通信模式。这些模式刻画了在运行时难以跟踪的,复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。行为设计模式的基本要素为:责任链(Chain of Responsibility);命令(Command);解释器(Interpreter);迭代器(Iterator);中介器(Mediator);备忘录(Memento);观察者(Observe);状态(State);策略(Strategy);模板方法(Template Method);访问者(Visitor)。
-
各种模式的描述:
|------|---------------------------|
| 装饰者 | 包装一个对象,以提供新的行为。 |
| 状态 | 封装了基于状态的行为,并使用委托在行为之间的切换。 |
| 迭代器 | 在对象的集合中游走,而不暴露集合的实现。 |
| 外观 | 简化一群类的接口。 |
| 策略 | 封装可以互换的行为,并使用委托来决定要使用哪一个。 |
| 代理 | 包装对象,以控制对此对象的访问。 |
| 工厂方法 | 由子类决定要创建的具体类是哪一个。 |
| 适配器 | 封装对象,并提供不同的接口。 |
| 观察者 | 让对象能够在状态改变时被通知。 |
| 模板方法 | 由子类决定如何实现一个算法中的步骤。 |
| 组合 | 客户用一致的方式处理对象集合和单个对象。 |
| 单件 | 确保有且只有一个对象被创建。 |
| 抽象工厂 | 允许客户创建对象的家族,,而无需指定他们的具体类。 |
| 命令 | 封装请求成为对象。 |
- 其他模式:
- **1.桥接模式:**使用桥接模式(Bridge Pattern)不只改变你的实现,也改变你的抽象。通过实现和抽象放在连个不同的类层次中而使它们可以独立改变。优点:将实现予以解耦,让它和界面之间不再永久绑定;抽象和实现可以独立扩展,不会影响对方;对于"具体的抽象类"所做的改变,不会影响到客户。用途和缺点:适合使用在需要跨越多个平台的图形和窗口系统上;当需要不同的方式改变接口和实现时,你就会发现桥接模式很好用;桥接模式的缺点时增加了复杂度。
- **2.生成器模式:**使用生成器模式(Builder Pattern) 封装一个产品的构造过程,并允许按步骤构造。生成器的优点:将一个复杂对象的创建过程封装起来;允许对象通过多个步骤来创建,并且可以改变过程(这和只有一个步骤的工厂模式不同);向客户隐藏产品的内部表现;产品的实现可以被替换,因为客户只看到一个抽象接口。用途和缺点:经常被用来创建组合结构;与工厂模式相比,采用生成器模式创建对象的客户,需要具备更多的领域知识。
- **3.责任链:**当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。通过责任链模式,你可以为某个请求创建一个对象链。每个对象依序检查此请求,并对其进行处理,或者将它传给链中的下一个对象。优点:将请求的发送者和接受者解耦,可以简化你的对象,因为它不需要知道链的结构;通过改变链内的成员或调动它们的次序,允许你动态地新增或者删除责任。用途和缺点:经常被使用在窗口系统中,处理鼠标和键盘之类的事件;并不保证请求一定会被执行,如果没有任何对象处理它的话,它可能会落到链尾端之外(既可能是优点也可能是缺点);可能不容易观察运行时的特征,有碍于除错。
- 4.蝇量: 如果想让某一个类的实例能用来提供许多"虚拟实例",就使用蝇量模式(Flyweight Pattern)。蝇量的优点:减少运行时对象实例的个数,节省内存;将许多"虚拟"对象的状态集中管理。蝇量的用途和缺点:当一个类有许多的实例,而这些实例能被同一方法控制的时候,我们就可以使用蝇量模式;不过一旦你实现了它,单个的逻辑实例将无法拥有独立而不同的行为。
- 5.解释器: 使用解释器模式(Interpreter Pattern)为语言创建解释器。当你要实现一个简单的语法时,就使用解释器模式定义语法的类,并用一个解释器解释句子。每个语法规则都用一个类代表。解释器模式的优点:将每一个语法规则表示成一个类,方便于实现语言;因为语法由许多类表示,所以你可以轻易地改变或扩展此语言;通过在类结构中加入新的方法,可以在解释的同时增加新的行为,例如打印格式的美化或者进行复杂的程序验证。用途和缺点:当你需要实现一个简单的语言时,使用解释器;当你有一个简单的语法,而且简单比效率更重要时,使用解释器;可以处理脚本语言和编程语言;当语法规则的数目太大时,这个模式可能会变得非常繁杂。在这种情况下,使用解析器/编译器的产生器可能更合适。
- **6.中介者:**使用中介者模式(Mediator Pattern)来集中相关对象之间复杂的沟通和控制方式。中介者内包含了整个系统的控制逻辑。当某装置需要一个新的规则时,或者是一个新的装置被加入系统内,其所有需要用到的逻辑也都被加入中介者内。优点:通过将对象彼此解耦,可以增加对象的复用性;通过将控制逻辑集中,可以简化系统维护;可以让对象之间所传递的消息变得简单而且大幅度减少。用途和缺点:中介者常常被用来协调相关的GUI组件;中介者模式的缺点是,如果设计不当,中介者对象本身会变得过于复杂。
- 7.备忘录: 当你需要让对象返回之前的状态时(例如,你的用户请求"撤销"),就使用备忘录模式(MementoPattern)。备忘录有两个目标:1.存储系统关键对象的重要状态。2.维护关键对象的封装。优点:将被存储的状态放在外面,不要和关键对象混在一起,这可以帮助维护内聚;保持关键对象的数据封装;提供了容易实现的恢复能力。用途和缺点:用于存储状态,存储和恢复状态的过程比较耗时,在Java系统中,可以考虑使用序列化(serialization)机制存储系统的状态。
- **8.原型:**当创建给定类的实例的过程很昂贵或很复杂时,就使用原型模式(Prototype Pattern).优点:向客户隐藏制造新实例的复杂性;提供让客户能够产生未知类型对象的选项;在某些环境下,复制对象比创建新对象更有效。用途和缺点:在一个复杂的类层次中,当系统必须从其中的许多类型创建新对象时,可以考虑原型;使用原型模式的缺点:对象的复杂有时相当复杂。
- **9.访问者:**当你想要为一个对象的组合增加新的能力,且封装并不重要时,就使用访问者模式(Visitor Pattern)。