设计模式的定义
- 设计模式:是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且提高代码的可靠性。
- 设计模式一种用于对软件系统中不断重现的设计问题的解决方案进行文档化的技术,也是一种共享专家设计经验的技术
- GoF对设计模式的定义如下:
设计模式是在特定环境下未解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用
设计模式的基本要素
设计模式一般包含模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素有以下4个:
- 模式名称
模式名称通过一两个词来描述模式的问题、解决方案和效果,以便更好地理解模式并方便开发人员之间的交流,绝大多数模式都是根据其功能或模式结构来命名的。例如:spring中的model(这个例子不是特别好不过也差不多,我们总是通过一些相同点来标记类似的事物不是么),XXXAdapter,这种可能是个适配器类,设计时可能使用了适配器模式(适配器作为一个对象);XXXFactory,该类可能是个工厂类,他可能包含了一个工厂方法用于返回一个类的实例对象。
- 问题
问题描述了应该在核实使用模式,它包含了设计中存在的问题以及问题存在的原因。我们通常情况下使用鱼骨图分析问题,确定问题原因后,设计解决方案,或套用其他设计模式解决问题。问题的描述必须足够完整,必须将先决条件完全描述
- 解决方案
解决方案描述了设计模式的组成成分,以及这些组成成分之间的相互关系、各自的职责和协作方式。模式是一个通用的模板,他们可以应用于各种不同的场合,解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决问题
- 效果
效果描述了模式应用的效果以及在使用模式时英犬横的问题。效果包含模式的优/缺点分析,没有完美的模式,只有完美的组合。一个模式在某些方面具有优点的同事可能在另一或几方面存在缺陷,音粗必须综合考虑模式的效果,评价模式时应通过妙想对象设计原则来分析
- 除了上述四个基本要素,完整的设计模式描述中通常还包含该模式的别名,模式的分类(模式的所属类别)、模式的适用性、模式的角色(模式参与者,模式中的类和对象以及他们之间的职责),模式实例(通过实例来进一步加深对模式的理解)、 模式应用(在已有系统中该模式的使用)、模式扩展(该模式的一些改进、与之相关的其他模式及其他扩展知识)等
设计模式的分类
根据目的分类
设计模式根据目的(模式是用来做什么的)可分为创见型(Creational)、**结构型(Structural)和行为型(Behavioral)**三类
- 创建型模式主要用于创建对象,GoF提供了物种创建型模式,分别是工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)和单例模式(Singleton)。
- 结构型模式主要用于处理类或对象的组合,GoF提供了7中结构型模式,分别是适配器模式(Adapter)、桥接模式(Bridge)、租着模式(Composite)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式(Proxy)
- 行为型模式主要用于描述累活对象怎样交互和怎样分配职责,GoF提供了11中行为型模式,分别是职责链模式(Chain of Responsibility)、命令模式(Command)、解释期末试(Interpreter)、迭代期末试(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy)、模版方法模式(Template Method)和访问者模式(Visitor)
根据范围分类
设计模式根据范围(即模式主要是用于处理类之间的关系还是处理对象之间的关系)可分为类模式和对象模式两种
- 类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时就被确定下来,是一种静态关系。
- 对象模式处理对象简单关系,这些关系在运行时变化,更具动态性。
GoF设计模式简介
模式一览
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | (类)适配器模式 | 解释器模式 模板方法模式 |
对象模式 | 抽象工厂模式 建造者模式 原型模式 单例模式 | (对象)适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 | 职责链模式 命令模式 迭代器模式 中介者模式 备忘录模式 观察者模式 状态模式 策略模式 访问者模式 |
模式简要说明
模式类别 | 模式名称 | 模式说明 |
创建型模式 (Creational Patterns) | 抽象工厂模式 (Abastract Factory Pattern) | 提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类 |
建造者模式 (Builder Pattern) | 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示 | |
工厂方法模式 (Factory Method Pattern) | 定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类 | |
原型模式 (Protorype Pattern) | 使用原型实例指定待创建对象的类型,并且通过赋值这个原型来创建新的对象 | |
单例模式 (Singleton Pattern) | 确保一个类只有一个实例,并提供一个全局访问点类访问这个唯一实例 | |
结构型模式 (Structural Patterns) | 适配器模式 (Adapter Pattern) | 将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作 |
桥接模式 (Bridge Pattern) | 将抽象部分与他的实现部分解耦,使得两者都能够独立变化 | |
组合模式 (Composite Pattern) | 组合多个对象性成熟型结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象 | |
装饰模式 (Decorator Pattern) | 动态的给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更加灵活的替代方案 | |
外观模式 (Façade Pattern) | 位子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层及接口,这个接口使得这椅子系统更加容易使用 | |
享元模式 (Flyweight Pattern) | 运用共享技术有效地支持大量细粒度对象的复用 | |
代理模式 (Proxy Pattern) | 给某一个对象提供一个代理或占位符,并有代理对象来控制对原对象的访问 | |
行为型模式 (Behavioral Patterns) | 职责链模式 (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) | 表示一个作用于某对象结构中的各个元素操作。访问者模式可以在不改变个元素的类的前提下定义作用域这些元素的新操作 |
模式的优点
设计模式时从许多优秀的软件系统中总结出的成功的、能够实现可维护性服用的设计方案,适用这些方案将避免做一些重复性的工作,而且可以设计出高质量的软件系统。具体来说,设计模式的有点主要如下:
- 设计模式融合了众多专家的经验,并以一种标准的性质公广大开发人员所用,他提供了一套通用的设计词汇和一种通用的语言毅方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。
- 设计模式时人们可以更加简单、方便的服用成功的设计和体系结构,将已证实的技术表述成设计模式也会是新系统开发者更加容易理解其设计思路。设计模式使得重用成分的设计更加容易,并避免那些导致不可重用的设计方案。
- 设计模式是的设计方案更加灵活,且容易修改。在软件开发中合理的使用设计模式可以使系统中的一些组成部分在其他系统中得以重用,而且在次基础上进行二次开发很方便。
- 设计模式的使用将提高软件系统的开发效率和软件质量,并且在一定程度上节约设计成本。
- 设计模式有助于初学者更深入的理解面向对象思想。