一.什么是设计模式
模式的定义:模式是一种问题的解决思路,它已经适用于一个实践环境,并且可以适用于其他坏境。
设计模式通常是对于某一类的软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要充分利用已有的软件开发经验。
Identify the aspects of your application that vary and separate them from what stays the same.(找到系统中变化的部分,将变化的部分同其它稳定的部分隔开)。换句话说就是:"找到变化并且把它封装起来,稍后你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分。" 尽管这个概念很简单,但是它几乎是所有设计模式的基础,所有模式都提供了使系统里变化的部分独立于其它部分的方法。
设计模式的种类很多,包括分布式编程模式、用户界面模式、数据模型模式三大类。目前流程的面向对象设计模式,仅1995年“gang of four”描述的就有二十多种,我们称之为GoF模式;与GoF模式相对应的另一种重要的设计模式是通用责任分配软件系列模式(GRASP)。
GRASP模式着重考虑设计类的原则及如何分配类的功能,而GoF模式则着重考虑设计的实现、类的交互和软件的质量。也就是说,GoF模式就是符合GRASP模式要求的面向对象设计模式。
模式应该有以下特点:
1. 在特定的场景下有可重用性,对相同类型不同问题的环境,其解决方案都有效。
2. 可传授性,即问题出现的机会很多,解决问题的方案相同,人们相对可以接受。
3. 有表示模式的名称。
二 设计模式的作用
1. 重用设计,重用设计比重用代码更有意义,它会自动带来代码的重用。
2. 为设计提供共用的词汇,每个模式名就是一个设计词汇,其概念使得程序员间的交流更加方便。
3. 在开发文档中采用模式词汇可以让其他人更容易理解你的想法,理解为什么你会这样做,你都做了些什么。编写开发文档也更加容易。
4. 应用设计模式可以让重构系统变得容易,可确保开发正确的代码,并降低在设计或实现中出现错误的可能性,还可以为重写其他应用程序提供很好的系统框架。
5. 正确使用设计模式,可以节省大量的时间。
三 GoF设计模式的分类
1.根据目的准则分类,就是说,指定的模式用来完成什么样的工作。可分为三种:
a. Creational (创建型):与对象创建有关。
b. Structural (结构型): 处理类或对象的组合。
c. Behavioral (行为型):描述类或对象如何交互及如何分配职责。
2.根据范围准则分类,即指定的模式用于类还是用于对象,分为两种:
类模式:用于处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时就已经确定下来了。因为从某种意义上说,几乎所有模式都是使用继承机制,因此,此处的“类模式”是指集中处理类间关系的模式,只有很少部分模式属于此类。
对象模式:用于处理对象间的关系,这些关系具有动态性,在运行期间是可以变化的。
范围\目的 | Creational (创建型) | Structural (结构型) | Behavioural (行为型) |
类 | Simple Factory | Adapter (class) | Interpreter |
Factory Method | Template method | ||
对象 | Abstract Factory | Adapter (object) | Chain of Responsibility |
Builder | Bridge | Command | |
Prototype | Composite | Iterator | |
Singleton | Decorator | Mediator | |
Facade | Memento | ||
Flyweight | Observer | ||
Proxy | State | ||
Strategy | |||
Visitor |
补充:关于GOF
《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"四人组(Gang of Four)",而这本书也就被称为"四人组(或 GoF)"书。