首页 > 代码库 > 设计模式学习笔记(一) 概论

设计模式学习笔记(一) 概论

1、设计模式的发展史

设计模式来源于建筑行业,20世纪的70年代,Christopher Alexander在研究为解决同一个问题而设计出的不同建筑结构时,发现那些高质量的设计中有很强的相似性。提出用“模式语言”来指代这种相似性。在Christopher Alexander的经典著作《建筑的永恒之道》中,给出了关于模式的定义:

模式描述一个在我们所处环境中不断出现的问题,已经该问题的解决方案的核心。通过模式,我们可以重复利用已有的成功解决方案。

(A pattern is  a successful or efficient solution to a recurring problem within a context)

注:《A pattern Language:Towns,Buildings,Construction》(牛津大学出版社 1997年);《永久的建筑风格》(牛津大学出版社 1979年)

1987年,Kent Beck和Ward Cunningham 把建筑学上的模式观点应用到软件的设计和开发。他们使用Small talk语言实现了雅致的用户界面。利用这个科技成果,他们在1987年召开了“面向对象的编程系统、语言和应用程序(OOPSIA)研讨会”,在会上以《在面向对象编程中使用模式语言》的演讲。

1994年,由Erich Gamma、Richard Helm、Ralph Johnson 和John Vlissides(模式四剑客 GoF) 合作编写《设计模式:可复用面向对象软件的基本原理》一书,书中明确定义了23中模式,成为现代软件设计模式的基础。

软件模式不只仅限于设计模式,还包括系统架构模式、需求分析模式和过程模式等,实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式

2、设计模式概述

 设计模式一般包含以下内容:

  • 模式名称(Pattern Name):描述模式需要解决的问题、对应的解决方案和所达到的效果。比如【汽车】,是用来解决陆地上较远距离的交通问题,其解决方案是通过燃烧特定的燃料或者其他能源转化为动能,实现承载人或者货物长距离运动,其效果就是能够大大节约我们长距离的旅行或者货物运输的时间成本。综合以上,我们称之为【汽车】,我们提到【汽车】时,人们都明白其指代对象是什么,这样也方便我们的沟通。
  • 问题(Problem):描述模式需要解决的问题以及问题存在的原因,及模式的应用场合。继续上面的例子,【汽车】是用来解决陆地上较远距离的运输问题,其先决条件是陆地上、较远距离、运输,如果用【汽车】来解决爬楼梯的问题,显然是不合适的。
  • 解决方案(Solution):描述模式的具体实施方法、实施步骤、以及方法、步骤各自的职责和相互之间的关系。实际应用中,我们常常使用UML类图或者伪代码来进行描述。
  • 应用效果(Consequences):对模式应用的优缺点进行描述,在实际应用中权衡利弊,选择合适的模式。

3、模式设计的基本原则

模式设计有六大基本原则:

 

单一职责原则: 一个类只负责一项职责。 

 

里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。 

 

依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

 

接口隔离原则:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

 

迪米特法则:一个对象应该对其他对象保持最少的了解。

 

开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

 

4、设计模式的分类

 根据设计模式的用途,设计模式主要分为三个类别:

  • 创建型模式:用于创建对象。主要包括以下模式:

单例模式(Singleton Pattern):应用中的某个功能模块需要保证其唯一性,不能同时并存多个实例,否则会引起信息或者资源的冲突,这个时候就需要用到单例模式,以保证对象实例化的唯一性。

简单工厂模式(simple Factory Pattern):

工厂方法模式(Factory Method Pattern)

抽象工厂模式(Abstract Factory Pattern)

原型模式(Prototype Pattern)

建造者模式(Builder Pattern)

  • 结构型模式:用于实现类和对象的组合。

适配器模式(Adapter Pattern)

桥接模式(Bridge Pattern)

组合模式(Composite Pattern)

装饰模式(Decorator Pattern)

外观模式(Facede Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

  • 行为型模式:用于类或对象交互关系和职责分配。

职责链模式(Chain of Responsibility Pattern)

命令模式(Command Pattern)

解释器模式(Interpreter Pattern)

迭代模式(Iterator Pattern)

中介模式(Mediator Pattern)

备忘录模式(Memento Pattern)

观察者模式(Observer Pattern)

状态模式(State Pattern)

策略模式(Strategy Pattern)

模板方法模式(Template Method Pattern)

访问者模式(Visitor Pattern)

 

 

后续的学习中会对每个模式进行详细的描述和例证,同时会更新本文档。

设计模式学习笔记(一) 概论