一、什么是设计模式
百度百科定义:设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验总结。
《设计模式:可复用面向对象软件基础》一书中是这样描述的,Christopher Alexander说:“每个模式描述了一个我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样就能一次又一次的使用改方案而不必重复劳动”,尽管 Alexande 所指的是城市和建筑的设计模式,但他的思想同样适用于面向对象的设计模式,只是在面向对象的解决方案里,我们用对象和接口代替了墙壁和门窗 。两类模式的核心都在于提供了相关问题的解决方案。
从上述定义中可以看到设计模式并不是什么高深莫测的知识,只是前人对现有的一类问题进行抽象并提供相应的解决方案。也许在你平常设计代码的结构中就使用了不少的设计模式只是你可能未曾把它总结出来,你已经通过自己的经验领悟到了一些设计模式的精髓,只是你并不知道它就是同事或者面试官常常提到提到的某某设计模式。
二、设计模式的四个基本要素
1、模式名称(pattern name) 一个助记名,它用一两个词来描述模式的问题、解决方案和效果。
2、问题(problem)描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。
3、解决方案(solution)描述了设计的组成成分,它们之间的相互关系和各自的职责和协作方式。
4、效果(consequence)描述了模式应用的效果以及使用模式应该权衡的问题。
三、描述设计模式
我们使用统一的格式描述设计模式,每一个模式根据以下模板被分成若干部分。模板具有统一的信息描述结构,有助于学习、比较和使用设计模式
模式名和分类
模式名比如:单例模式、抽象工厂模式,简洁的描述了模式的本质,分类比如创建型模式、结构形模式、行为模式。
意图
是回答下面问题的简单描述,设计模式是做什么?它的基本原理和意图是什么?它解决什么样的特定设计问题?
别名:模式的其它名称
动机:用以说明一个设计问题以及如何用模式中的类、对象来解决该问题的特定情景。
适用性
什么情况下可以使用该设计模式?该模式可用来改进哪些不良设计?你怎样识别这些情况?
结构
采用基于对象建模技术的表示法对模式中的类进行图形描述。
参与者
指设计模式中的类和对象,以及它们的各自职责。
协作
模式的参与者怎样协作以实现它们的职责。
效果
模式怎样支持它的目标?使用模式的效果和所需做的权衡取舍?系统结构的哪些方面可以独立改变?
实现
实现模式时需要知道的一些提示、技术要点以及避免的缺陷,以及是否存在某些特定于实现语言的问题。
代码示例
用某种语言比如java 或者C++实现该模式的代码片段。
已知应用
实际系统中发现的模式的例子。
相关模式
与这个模式密切相关的模式有哪些?其间重要的不同之处是什么?这个模式应与哪些模式一起使用。
四、设计模式分类以及常用的23种设计模式
1、创建型设计模式
创建型模式抽象了实例化过程。它们帮助一个系统独立于如何创建、组合和表示它的那些对象。
Abstract Factory(抽象工厂模式)——对象创建型模式
Builder(生成器)——对象创建型模式
Factory Method (工厂方法)——对象创建型模式
Prototype(原型模式)——对象创建型模式
Singleton(单例模式)——对象创建型模式
2、结构型模式
结构型模式涉及到如何组合类和对象以获得更大的结构。
结构型类模式采用继承机制来组合接口或实现。一个简单的例子是采用多重继承方法将两个以上的类组合成一个类,结果是这个类包含了所有父类的性质。
结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态组合是不可能实现的。
Adapter(适配器模式)——类对象结构型模式
Bridge(桥接模式)——对象结构模式
Composite(组合模式)——对象结构模式
Decorator(装饰模式)——对象结构模式
Facade(外观模式)——对象结构模式
Flyweight(享元模式)——对象模式
Proxy(代理模式)——对象结构模式
在这里我们再次看到设计模式不是什么复杂高深的知识,结构型设计模式无非就是通过继承和组合来实现。
类结构型模式使用继承方式实现,在这里我们可以猜测到适配器模式Adapter(适配器模式)的实现方法是通过子类继承多个父类(比如需要实现适配的两个父类)来实现。其它六种对象结构模式的实现方法就是通过对象的组合,至于如何组合我们且看后面的讲解。
3、行为模式
行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式,。这些模式划分了在运行时难以跟踪的复杂的控制流。它们将你的注意力从控制流转移到对象间的联系方式上来。
行为类模式使用继承机制在类间分派行为。
行为对象模式使用对象复合(也就是对一些对象进行组合)而不是继承。
在这里我们又可以看到类模式都是使用继承机制实现,对象型模式是使用对象间的组合实现。
Chain of responsibility(职责链模式)——对象行为模式
Command(命令模式)——对象行为模式
Interpreter(解释器模式)——类行为模式
Iterator(迭代器模式)——对象行为型模式
Mediator(中介者模式)——对象行为型模式
Memento(备忘录模式)——对象行为型模式
Observer(观察者模式)——对象行为模式
State(状态模式)——对象行为模式
Strategy(策略模式)——对象行为模式
Template Method(模板方法)——类行为型模式
Visitor(访问者模式)——对象行为模式
在这里我们可以看到我们所使用的语言的库的设计就使用不少设计模式,比如java语言,大家在遍历List或者Map时候使用过Iterator吧,java 里面的Iterator应该就是Iterator(迭代器模式)的实现。还有在android 或者ios开发中经常用到的Observer就是Observer(观察者模式)的实现。
最后在说一句设计模式绝不是什么高深的知识,但是它非常有用,只有掌握了常用的设计模式才可能成为软件开发领域的设计工程师,否则就像建筑行业里面的搬砖工。
五、设计模式之间的关系
不同的设计模式在使用时是会有联系的,通常会将几种设计模式组合起来一起使用,下面是《设计模式:可复用面向对象软件基础》一书中给出的设计模式关系图,也许你现在还不如全部理解下图所描述的模式之间的关系,但在跟着我的博客一起把设计模式学完之后,你将能够轻松的理解下图所描述的关系,相信那时再回过头来看这副图的时候会会心一笑的。