软件模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认同的模式。
软件模式可以认为是对软件开发这一特定“问题”的“解法”的某种统一标识,软件模式等于一定条件下的出现的问题以及解法。软件模式的基础结构由4个部分构成:
- 问题描述
- 前提条件(环境或约束条件)
- 解法
- 效果
软件模式与具体的应用领域无关,在模式发现过程中需要遵循大三律(Rule of Three),即只有经过三个以上不同类型(或不同领域)的系统的校验,一个解决方案才能从候选模式升格为模式。
设计模式
定义
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
基本要素
设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、示例代码和相关设计模式,其中的关键元素包括以下四个方面:
- 模式名称(Pattern name)
- 问题(Problem)
- 解决方案(Solution)
- 效果(Consequences)
分类
根据其目的(模式是用来做什么的)可分为创建型(Creational)、**结构型(Structural)和行为型(Behavioral)**三种:
- 创建型模式主要用于创建对象
- 结构型模式主要用于处理类或对象的组合
- 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责
跟据范围,即模式主要是用于处理类之间关系还是处理对象之间关系,可分为类模式和对象模式两种:
- 类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是属于静态的
- 对象模式处理对象之间的关系,这些关系在运行时刻变化,更具动态性
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | (类)适配器模式 | 模板方法模式 |
对象模式 | 抽象工厂模式 建造者模式 原型模式 单例模式 |
(对象)适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 |
命令模式 迭代器模式 中介者模式 观察者模式 状态模式 策略模式 |
设计模式与类库框架
如果设计模式这么棒,为什么没人把它写成库?
设计模式比类库具有更高的(抽象)层次。设计模式告诉我们怎样构造类和对象来解决确定的问题,并且我们有责任调整这些设计来适应我们自己特定的应用
库和框架不也是设计模式吗?
框架和库不是设计模式,它们提供了我们链接到代码中的特定实现。然而,有时库和框架在其实现中使用设计模式。这太棒了,因为一旦你了解了设计模式,你就会更快速地理解那些用设计模式构建的API
设计原则
对于面向对象的软件系统设计来说,在支持可维护性的同时,需要提高系统的可复用性
软件的复用可以提高系统的开发效率,提高软件质量,节约开发成本,恰当的复用开可以改善系统的可维护性
- 单一职责原则要求在软件系统中,一个类只负责一个功能领域中的相应职责
- 开闭原则要求一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个系统的行为
- 里氏代换原则则可以通俗地表述为在软件中如果能够使用基类对象,那么一定能够使用其子类对象
- 依赖倒转原则要求抽象不应该依赖于细节,细节应该依赖于抽象;要对接口编程,不要针对实现编程
- 接口隔离原则要求客户端不应该依赖那些它不需要的接口,即将一些大的接口细化成一些小的接口供客户端使用
- 合成复用原则要求复用时尽量使用对象组合,而不使用继承
- 迪米特法则要求一个软件实体应当尽可能少地与其他实体发生相互作用
原则分类
目标:开闭原则
指导:最小知识原则
基础:单一职责原则、可变性封装原则
实现:依赖倒转原则、合成复用原则、里氏代换原则、接口隔离原则
具体设计模式介绍
策略模式
优点
- 对“开闭原则”的完美支持,在不修改原有系统的基础上可以更换算法或者增加新的算法
- 它很好地管理算法族,提高了代码的复用性,是一种替换继承,避免多重条件转移语句的实现方式
缺点
- 客户端必须知道所有的类,并理解其区别
- 同时在一定程度上增加了系统中类的个数,可能会存在很多策略类
适用情况
- 在一个系统中有许多类,它们之间的区别仅在于它们的行为,使用策略模式可以动态地让一个对象在许多行为中选择一种行为
- 一个系统需要动态地在几种算法中选择一种
- 避免使用难以维护的多重条件选择语句
- 希望在具体策略类中封装算法与相关数据结构
简单工厂模式
创建型模式对类的实例化过程进行了抽象,能够将对象的创建与对象的使用过程分离
简单工厂模式又称为静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类
简单工厂模式包含3个角色:
- 工厂角色负责实现创建所有实例的内部逻辑
- 抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口
- 具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例
简单工厂模式的要点在于:传入正确参数即可获得所需对象,而无需知道创建细节
优点
最大优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责,
缺点
其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法会非常复杂
适用情况
- 工厂类负责创建的对象比较少
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心
工厂方法模式
工厂方法模式又称为工厂模式,它属于创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而子类工厂则负责生成成具体的产品对象,