软件模式
- 软件模式是将模式的一般概念应用于软件开发领域,即软件开发的总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括架构模式、分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认同的模式。
- 软件模式可以认为是对软件开发这一特定“问题”的“解法”的某种统一表示,软件模式等于一定条件下的出现的问题以及解法。软件模式的基础结构由 4 个部分构成:问题描述、前提条件(环境或约束条件)、解法和效果。
- 要能讲清为什么使用某个模式
- 软件模式与具体的应用领域无关,在模式发现过程中需要遵循大三律(Rule of Three),即只有经过三个以上不同类型(或不同领域)的系统的校验,一个解决方案才能从候选模式升格为模式。
设计模式的定义
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式的基本要素
设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面:
- 模式名称(Pattern name)
- 问题(Problem)
- 解决方案(Solution)
- 效果(Consequences)
设计模式的分类
- 根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种:
- 创建型模式主要用于创建对象。
- 结构型模式主要用于处理类或对象的组合。
- 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。
- 根据范围,即模式主要是用于处理类之间关系还是处理对象之间的关系,可分为类模式和对象模式两种:
- 类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是属于静态的。
- 对象模式处理对象间的关系,这些关系在运行时刻变化,更具动态性。
范围/目的 | 创建型模式 | 结构型模式 | 行为型模式 |
---|---|---|---|
类模式 | 工厂方法模式 | (类)适配器模式 | 模板方法模式 |
对象模式 | 抽象工厂模式 |
(对象)适配器模式 组合模式 装饰模式 外观模式 代理模式 |
命令模式 中介者模式 观察者模式 状态模式 策略模式 |
享元模式为什么是结构型模式:
模板方法为什么是行为型模式:子类控制父类的行为
设计模式与类库框架
设计原则
- 对于面向对象的软件系统设计来说,在支持可维护性的同时,需要提高系统的可复用性。
- 软件的复用可以提高软件的开发效率,提高软件质量,节约开发成本,恰当的复用还可以改善系统的可维护性。
- 单一职责原则:要求在软件系统中,一个类只负责一个功能领域中的相应职责。
- 开闭原则:要求一个软件实体应当对扩展开放,对修改关闭,即在不修改源代码的基础上扩展一个系统的行为。
- 里氏代换原则:可以通俗表述为在软件中如果能够使用基类对象,那么一定能够使用其子类对象。
- 依赖倒转原则:要求抽象不应该依赖于细节,细节应该依赖于抽象;要针对接口编程,不要针对实现编程。
- 接口隔离原则:要求客户端不应该依赖那些它不需要的接口,即将一些大的接口细化成一些小的接口供客户端使用。
- 合成复用原则:要求复用时尽量使用对象组合,而不使用继承。
- 迪米特法则:要求一个软件实体应当尽可能少的与其他实体发生相互作用。
设计原则之间的关系
- 目标:开闭原则
- 指导:迪米特法则(最小知识原则)
- 基础:单一职责原则、可变性封装原则
- 实现:依赖倒转原则、合成复用原则、里氏代换原则、接口隔离原则
表驱动法
- 目标
- 原理
- 如何快速从表中查询条目
- 直接访问
- 索引访问
- 阶梯访问
模式的别名
模式名称 | 模式英文名 | 模式别名 |
---|---|---|
简单工厂模式 | Simple Factory Pattern | 静态工厂方法(Static Factory Method)模式 |
工厂方法模式 | Factory Method Pattern | 工厂模式,虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式 |
抽象工厂模式 | Abstract Factory Pattern | Kit 模式 |
策略模式 | Strategy Pattern | Policy Pattern |
状态模式 | State Pattern | 状态对象(Objects for States) |
命令模式 | Command Pattern | 动作(Action)模式、事务(Transaction)模式 |
适配器模式 | Adapter Pattern | 包装器(Wrapper) |
装饰器模式 | Decorator Pattern | 包装器(Wrapper)、油漆工模式(翻译不同) |
中介者模式 | Mediator Pattern | 调停者模式(翻译不同) |
桥接模式 | Bridge Pattern | 柄体(Handle and Body)模式、接口(Interface)模式 |
外观模式 | Facade Pattern | 门面模式 |
享元模式 | Flyweight Pattern | 轻量级模式 |
练习题
- Every Design Pattern allows the developer to vary different parts of a design. Complete the following table:
Purpose | Design Pattern | 可变的方面 |
---|---|---|
创建型模式 | 抽象工厂模式 | 容易添加新的具体工厂类、新的产品层级、产品族和具体产品 |
结构型模式 | 适配器模式 | c |
结构型模式 | 装饰者模式 | 容易添加被装饰的组件、添加的额外职责和装饰后的组件 |
行为型模式 | 观察者模式 | 容易添加具体的观察者和被观察者,以及他们之间的观察关系 |
行为型模式 | 状态模式 | 方便地增加新的状态,只需要改变对象状态即可改变对象的行为 |
创建型模式 | 工厂方法模式 | 容易添加新的具体产品和新的具体工厂 |
行为型模式 | 策略模式 | 容易添加新的策略 |
结构型模式 | 外观模式 | 不容易修改:在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则” |
行为型模式 | 命令模式 | 容易添加新命令、设计组合命令和宏命令、方便实现命令的 undo 和 redo |
- In object-oriented programming one is advised to avoid case (and if) statements. Select one design pattern that helps avoid case statements and explain how it helps.
策略模式:将不同的策略逻辑放入不同的策略类中,而不是放到一个大的 if-else 或 case 语句中管理,实现了逻辑控制代码和实现代码的分离,客户类只需要设置好策略后进行类似 stragety.operate()
的调用即可完成操作。
- The ATM provides two types of transaction, withdrawals and deposits. For every transaction, the user specifies a reference account (for deposit to or withdrawal from) and a dollar amount. Withdrawals can either be made in cash to the user or as a transfer to another account. For cash withdrawals, the user chooses the denominations of the payment; for transfers, the user specifies a target account. Draw the design class diagram. Code is not required.
classDiagram class ATM { +withdrawal(account: Account, amount: double): void +deposit(account: Account, amount: double): void } class Transaction { +account: Account +amount: double +execute(): void } class Withdrawal { +denominations: List+targetAccount: Account +execute(): void } class Deposit { +execute(): void } class Account { +balance: double } class Denomination { +value: double +count: int } class Transfer { +targetAccount: Account +execute(): void } ATM --> Transaction Transaction <|-- withdrawal transaction <|-- deposit --> Account Withdrawal --> Denomination Withdrawal --> Transfer Deposit --> Account Transfer --> Account|-->