【系统架构设计师】七、设计模式
7.1 设计模式概述
设计经验在实践者之间日益广泛地利用,描述这些共同问题和解决这些问题的方案就形成了所谓的模式。
7.1.1 设计模式的历史
建筑师Christopher Alexander首先提出了模式概念,他将模式分为了三个部分:
- 特定的情景(Context):模式在何种情况下发生作用;
- 动机(System of force):问题或预期的目标;
- 解决方案(Solution):平衡各动机或解决所阐述问题的一个构造或配置。
模式是表示特定的场景、动机、解决方案三个方面关系的一个规则,每个模式描述了一个在特定情景下不断重复发生的问题,以及该问题解决方案的核心所在。
模式既是一个事物又是一个过程,不仅描述该事物本身,而且提出了通过怎样的过程产生该事物。
设计模式的核心是问题描述和解决方案,问题描述说明模式的最佳使用场合及它将如何解决问题,解决方案是用一组类和对象及其结构动动态协来描述的。
20世纪80年代中期,由Ward Cunningham和Kent Beck将其思想引入到软件领域。1995年,E.Gamma,R.Helm,R.Johnson和J.Vlissides 4人合著了Design Patterns: Elements of Object-Roiented Software(设计模式:可复用面向对象软件的基础)这一经典书籍,这四位大师级人物也被称为Gang Of Four(GoF)。
7.1.2 为什么要使用设计模式
设计模式的应用对软件开发有重大的作用:
- 简化并加快设计
- 方面开发人员之间的通信
- 降低风险
- 有助于转向面向对象技术
而成熟的软件设计模式:
- 巧妙:设计模式是在大量实践经验的基础上提炼出来的;
- 通用:设计模式不依赖特定的系统类型、程序设计语言、应用领域;
- 得到证明:设计模式在实际系统和面向对象系统中已得到了广泛应用;
- 简单:设计模式提炼了精简的类设计思想;
- 可重用:设计模式的建档方式使它们非常易于使用;
- 面向对象:设计模式是用最基本的面向对象机制构造的,并特定强调区分接口和实现、降低各部分之间的依赖、隔离硬件和软件等面向对象设计的特性。
7.1.3 设计模式的组成元素
- 模式名
- 问题或意图
- 情景
- 动机
- 解决方案
- 示例
- 结果情景
- 基本原理
- 相关模式
- 已知应用
7.1.4 设计模式的分类
设计模式主要用于得到简洁灵活的系统设计,GoF的书中共有23个设计模式,这个模式可以按两个准则来分类:
一是按设计模式的目的划分:创建型、结构型和行为型三种模式;
二是按设计模式的范围划分(根据设计模式作用于类还是作用于对象):类设计模式和对象设计模式。
- 创建型模式:对对象实例化过程的抽象,它通过采用抽象类所定义的接口,封装了系统中对象如何创建、组合等信息;
- 结构型模式:主要用于如何组合已有的类和对象以获取更大的结构,一般借鉴封装、代理、集成等概念将一个或多个类或对象进行组合、封装,以提供统一的外部视图或新的功能。
- 行为型模式:用于对象之间的职责及其提供的服务的分配,描述对象或类的模式、它们之间的通信模式、及对象间协作完成其单一对象无法单独完成的任务。
7.2 设计模式实例
7.2.1 创建型模式(5种)
1、Abstract Factory(抽象工厂)
为创建一系列相关或者相互依赖的对象提供了一个接口。根据给定的相关抽象类,抽象工程模式提供了一个相匹配的具体子类集创建这些抽象类的实例的方法。
2、Builder(构建器)
构建器模式将复杂对象的构建与其表示相分离,这样相同的构造过程可以创建不同的对象。通过指定对象的类型和内容,构建器模式允许客户端对象构建一个复杂对象。客户端可以不受该对象构造的细节的影响。
3、Factory Method(工厂方法)
工厂方法模式定义了创建对象的接口,它允许子类决定实例化哪个类。它允许将实例化的工作交给其他的子类。
4、Prototype(原型)
原型模式允许对象在不了解要创建对象的确切类以及如何创建等细节的情况下创建自定义对象。原型模式使用动态创建对象更加简单,只要将对象类定义成能够复制自身就可以实现。
5、Singleton(单例)
单例模式确保一个类只有一个实例,并且提供了对该类的全局访问入口,它可以确保使用这个类的实例的所有的对象使用相同的实例。
7.2.2 结构型模式(7种)
1、Adapter(适配器)
适配器模式可以充当两个类之间的媒介,它可以转换一个类的接口被另外一个类使用,使得具有不兼容接口的类能够协同使用。
2、Bridge(桥接)
桥接模式可以将一个复杂的组件分成两个独立的但又相关的继承层次结构:功能性的抽象和内部实现。
3、Composite(组合)
组合模式允许创建树型层次结构来改变复杂性,允许结构中的每一个元素操作同一个接口。
4、Decorator(装饰器)
装饰器模式可以在不修改对象外观和功能的情况下添加或者删除对象功能。
5、Facade(外观)
外观模式为子系统中的一组接口提供了一个统一的接口。这个统一的接口允许对象使用该接口与子系统进行通信,从而实现对子系统的访问。
6、Flyweight(享元)
轻量模式可以通过共享对象减少系统中低等级的、详细的对象数目。
7、Proxy(代理)
代理模式为控制对初始对象的访问提供了一个代理或者占位符对象。它的实现可以有多个类型,如:远程代理和虚拟代理等。
7.2.3 行为模式(11种)
1、Chain of Responsibility(责任链)
责任链模式可以在系统中建立一个链,可以让传递的消息在首先接收到它的级别处理,或者定位到可以处理它的对象。
2、Command(命令)
命令模式在对象中封装了请求,这样可以保存命令,将该命令传递给方法以及像任何其他对象一样返回该命令。
3、Interpreter(解释器)
解释器模式可以解释定义其它语法表示的语言,还提供了用于表示解释语言中的语句解释器。
4、Iterator(迭代器)
迭代器模式为集中的有序访问提供了一致的方法,而该集合是独立于基础集合并与之相分离的。
5、Mediator(中介)
中介模式通过引入一个能够管理对象间消息分布的对象,简化了系统中对象间的通信。该模式可以减少对象之间的相互引用,从而提高了对象间的松耦合度。
6、Memento(备忘录)
备忘录模式可以保持对象状态的“快照”,这样对象可以在不向外界公开其内容的情况下返回到它的最初状态。
7、Observer(观察者)
观察者模式为组件向相关接收方广播消息提供了灵活的方法。该模式定义了对象间一到多的依赖关系,这样当对象改变状态时,将自动通知并更新它所有的依赖对象。
8、State(状态)
状态模式允许对象在内部状态变化时,变更其行为,并修改其类。
9、Strategy(策略)
策略模式定义了一组能够用来表示可能行为集合的类,这些行为可以在应用程序中使用,来修改应用程序功能。
10、Template Method(模板方法)
模板方法模式提供了在不重写方法的前提下允许子类重载部分方法的方法。
11、Vistor(访问者)
访问者模式提供了一种方便的、可维护的方法来表示在对象结构元素上要进行的操作。该模式允许在不改变操作元素的类的前提下定义一个新的操作。