1、定义
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。
狭义的设计模式是指GoF在《设计模式:可复用面向对象软件的基础》一书中所介绍的23种经典设计模式,不过设计模式并不仅仅只有这23种,随着软件开发技术的发展,越来越多的新模式不断诞生并得以应用。
2、简介
设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果。模式名称(Pattern Name)通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的;问题(Problem)描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因;解决方案(Solution)描述了一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过UML类图和核心代码来进行描述;效果(Consequences)描述了模式的优缺点以及在使用模式时应权衡的问题。
3、分类
虽然GoF设计模式只有23个,但是它们各具特色,每个模式都为某一个可重复的设计问题提供了一套解决方案。根据它们的用途,设计模式可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种,其中创建型模式主要用于描述如何创建对象,结构型模式主要用于描述如何实现类或对象的组合,行为型模式主要用于描述类或对象怎样交互以及怎样分配职责,在GoF 23种设计模式中包含5种创建型设计模式、7种结构型设计模式和11种行为型设计模式。此外,根据某个模式主要是用于处理类之间的关系还是对象之间的关系,设计模式还可以分为类模式和对象模式。我们经常将两种分类方式结合使用,如单例模式是对象创建型模式,模板方法模式是类行为型模式。
值得一提的是,有一个设计模式虽然不属于GoF 23种设计模式,但一般在介绍设计模式时都会对它进行说明,它就是简单工厂模式,也许是太“简单”了,GoF并没有把它写到那本经典著作中,不过现在大部分的设计模式书籍都会对它进行专门的介绍。
创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|
单例模式(Singleton Pattern) | 适配器模式(Adapter Pattern) | 职责链模式(Chain of Responsibility Pattern) |
简单工厂模式(Simple Factory Pattern | 桥接模式(Bridge Pattern) | 命令模式(Command Pattern) |
工厂方法模式(Factory Method Pattern) | 组合模式(Composite Pattern) | 解释器模式(Interpreter Pattern) |
抽象工厂模式(Abstract Factory Pattern) | 装饰模式(Decorator Pattern) | 迭代器模式(Iterator Pattern) |
原型模式(Prototype Pattern | 外观模式(Facade Pattern) | 中介者模式(Mediator Pattern) |
建造者模式(Builder Pattern) | 享元模式(Flyweight Pattern) | 备忘录模式(Memento Pattern) |
代理模式(Proxy Pattern ) | 观察者模式(Observer Pattern) | |
状态模式(State Pattern) | ||
策略模式(Strategy Pattern) | ||
模板方法模式(Template Method Pattern) | ||
访问者模式(Visitor Pattern) |
4、作用
(1) 设计模式来源众多专家的经验和智慧,它们是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作,设计模式无疑会为有助于我们提高开发和设计效率,但它不保证一定会提高。
(2) 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。
(3) 大部分设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写一些重复的代码。此外,随着软件规模的日益增大,软件寿命的日益变长,系统的可维护性和可扩展性也越来越重要,许多设计模式将有助于提高系统的灵活性和可扩展性,让我们在不修改或者少修改现有系统的基础上增加、删除或者替换功能模块。
(4) 合理使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快地理解系统。
(5) 对初学者来说,学习设计模式将有助于初学者更加深入地理解面向对象思想。
5、学习设计模式
1、勤于思考。
在学习每一个设计模式时至少应该掌握如下几点:这个设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它;它是如何解决的,掌握它的结构图,记住它的关键代码;能够想到至少两个它的应用实例,一个生活中的,一个软件中的;这个模式的优缺点是什么,在使用时要注意什么。
2、不要滥用模式。
不要试图在一个系统中用上所有的模式,不能为了使用模式而使用模式。滥用模式不如不用模式,因为滥用的结果得不到“艺术品”一样的软件,很有可能是一堆垃圾代码。
3、循序渐进。
设计模式的“上乘”境界:“手中无模式,心中有模式”。模式使用的最高境界是你已经不知道具体某个设计模式的定义和结构了,但你会灵活自如地选择一种设计模式来解决某个问题,设计模式已经成为你开发技能的一部分,能够手到擒来。要达到这个境界并不是看完某本书或者开发一两个项目就能够实现的,它需要不断沉淀与积累,所以,对模式的学习不要急于求成。
【参考文章:刘伟 http://blog.csdn.net/lovelion】