设计模式简介
一直想总结一下设计模式,已经拖了大半年了,今天正式开始吧。
什么是设计模式?
设计模式(Design pattern)是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。
设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。
项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
设计模式的由来
设计模式(Design pattern)是由GOF 在他们的书—Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)中首次提出。
GOF (四人帮,全拼Gang of Four),代表了四个人(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides ),他们在1994年合著了上面说的这本书。
他们所提出的设计模式主要是基于以下的面向对象设计原则。
* 对接口编程而不是对实现编程。
* 优先使用对象组合而不是继承。
设计模式的四个基本要素
一般而言,一个模式有四个基本要素:
模式名称(pattern name) 一个助记名,它用一两个词来描述模式的问题、解决方案 和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上 进行设计。基于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使 用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当 的模式名也是我们设计模式编目工作的难点之一。
问题(problem) 描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后 果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设 计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
解决方案(solution) 描述了设计的组成成分,它们之间的相互关系及各自的职责和协 作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定 而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
效果(consequences) 描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处 具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因 为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植 性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。
设计模式的两个主要用途
开发人员的共同平台
设计模式提供了一个标准的术语系统,且具体到特定的情景。例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计模式的开发人员都能使用单个对象,并且可以通过这种方式告诉对方,程序使用的是单例模式。
最佳、最快速的解决方案
设计模式已经经历了很长一段时间的发展,他们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单会计的方式来学习软件设计,和快速和优雅的实现某一类场景的程序。
设计模式描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。
在Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)一共提到了23种设计模式,其实还有一些小型的或者子设计模式,比如简单工厂模式,再比如代理模式又分为远程代理、保护代理等等。
设计模式的分类
设计模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。
创建型模式:提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。
结构型模式:这类设计模式关注类和对象的组合,继承的概念被用来组合接口以及定义组合对象获得新功能的方式。
行为型模式:这类设计模式更关注对象之间的通信。
据说还有两类:并发性模式 和 线程池模式,这两种还没接触过。
类型 | 包含的模式 |
---|---|
创建性模式 | 工厂方法模式(Factory Method Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) |
结构型模式 | 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) |
行为型模式 | 策略模式(Strategy Pattern) 模板方法模式(Template Method Pattern) 观察者模式(Observer Pattern) 迭代器模式(Iterator Pattern) 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 备忘录模式(Memento Pattern) 状态模式(State Pattern) 访问者模式(Visitor Pattern) 中介者模式(Mediator Pattern) 解释器模式(Interpreter Pattern) |
各种设计模式之间的关系
参考:
百度百科-设计模式
http://www.runoob.com/design-pattern/design-pattern-intro.html
书籍:
《Head First 设计模式》
《设计模式 - 可复用的面向对象软件元素》
《设计模式之禅》