每个模式都描述了一个在我们的的环境中不断出现的问题,然后描述了该问题解决方案的核心,然后通过这种方式,我们可以无数次地重用那些已有的成功的解决方案,无需再重复相同的工作。
模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案。
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。
软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件开发生命周期的每一个阶段都存在着一些被认同的模式。
软件模式是在软件开发过程中某些可重现问题的一些有效解决方法,软件模式的基础结构主要由四部分组成,包括问题描述(待解决的问题是什么)、前提条件(在何种环境或约束条件下使用)、解法(如何解决)和效果(有哪些优缺点)。
设计模式用于在特定条件下为一些重复出现的软件设计问题提供合理的、有效的解决方案。
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码的可靠性。
设计模式一般包含模式名称、问题、目的、解决方案、效果等组成要素,其中关键要素是模式名称、问题、解决方案和效果。
模式名称(Pattern Name)通过一两个词来描述模式的问题、解决方案和效果,以便更好的理解模式并方便开发人员之间的交流,绝大多模式都是根据其功能或模式结构来命名的。
问题描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因。
解决方案描述了一个设计模式的组成成分,以及这些组成成分之间的相互关系,各自的职责和协作方式,通常解决方案通过UML类图和核心代码进行描述。
效果描述了模式的优缺点以及在使用模式时应权衡的问题。
根据用途,设计模式可以分为创建型、结构型和行为型三种。创建型模式主要用于描述如何创建对象;结构型模式主要用于描述如何实现类或对象的组合;行为型模式主要用于描述类或对象怎样交互以及怎样分配职责。
设计模式一览表:
类型 | 模式名称 | 学习难度 | 使用频率 |
---|---|---|---|
创建型模式 | 单例模式 | 1 | 4 |
简单工厂模式 | 2 | 3 | |
工厂方法模式 | 2 | 5 | |
抽象工厂模式 | 4 | 5 | |
原型模式 | 3 | 3 | |
建造者模式 | 4 | 2 | |
结构型模式 | 适配器模式 | 2 | 4 |
桥接模式 | 2 | 4 | |
组合模式 | 3 | 4 | |
装饰模式 | 3 | 3 | |
外观模式 | 1 | 5 | |
享元模式 | 4 | 1 | |
代理模式 | 3 | 4 | |
行为型模式 | 职责链模式 | 3 | 2 |
命令模式 | 3 | 4 | |
解释器模式 | 5 | 1 | |
迭代模式 | 3 | 5 | |
中介者模式 | 3 | 2 | |
备忘录模式 | 2 | 2 | |
观察者模式 | 3 | 5 | |
状态模式 | 3 | 3 | |
策略模式 | 1 | 4 | |
模板方法模式 | 2 | 3 | |
访问者模式 | 4 | 1 |
- 设计模式来源众多专家的经验和智慧,他们是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案可以让我们避免做一些重复性的工作,也许我们冥思苦想得到的一个”自以为很了不起“的设计方案其实就是某一个设计模式。时间就是金钱的今天,设计模式无疑会有助于提高开发和设计效率。但它不保证一定会提高。
- 设计模式提供了一套通用的设计词汇和一种通用的形式来方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。
- 大部分的设计模式都兼顾了系统的可重用性和可扩展性,这使得我们可以更好地重用一些已有的设计方案、功能模块甚至一个完整的软件系统,避免我们经常做一些重复的设计、编写一些重复的代码。
- 合理的是使用设计模式并对设计模式的使用情况进行文档化,将有助于别人更快的理解系统。
- 学些设计模式有助于初学者更加深入地理解面向对象思想。
单一职责原则:一个类只负责一个功能领域的相应职责
开闭原则:软件实体应该对扩展开放,而对修改关闭
里氏替换原则:所有引用基类对象的地方能够透明地使用其子类的对象
依赖倒转原则:抽象不应该依赖于细节,细节应该依赖于抽象。
接口隔离原则:使用多个专用的接口,而不使用单一的总接口。
合成复用原则:尽量使用对象组合,而不是继承来达到复用的目的。
迪米特法则:一个软件实体应当尽可能少地与其他实体发生相互作用。