本文主要分析了模板方法模式、命令模式、责任链模式、策略模式、迭代器模式,介绍它们的定义、优缺点、使用场景,以及实例代码。为了深刻地理解设计模式,最重要的还是动手编写代码。
我参照书中的例程重新构想了一些更加生动、易于理解的例子,希望大家喜欢。
代码可以通过以下链接进行浏览:
这些代码都经过编译运行,保证没有错误。
- 模板方法
- 定义
- 定义一个操作中的算法框架,而将一些步骤延迟到子类中
- 角色:抽象模板、具体模板
- 优点
- 封装不变的部分,扩展可变的部分
- 提取公共部分的代码,便于维护
- 行为由父类控制、子类实现
- 使用场景
- 多个子类有公共方法时,并且逻辑结构基本相同
- 可以把重要的算法作为模板方法,把细节由子类实现
- 重构时模板方法是一个经常使用的模式,将相同的代码抽取到父类
- 命令模式
- 定义
- 又称动作模式、事务模式
- 将一个请求封装成一个对象,从而让你把不同的请求把客户端参数化,对请求排队,或者记录请求日志
- 角色:命令角色、具体命令、调用者角色、接受者角色
- 优点
- 缺点
- 使用场景
- 可以用于实现回调函数
- 需要将请求排队
- 需要将请求记录到日志
- 需要支持事务
- 责任链模式
- 定义
- 使多个对象都有机会处理请求,从而避免了发送者和接受者的耦合。这些对象形成一条链,并沿着这条链传递该请求,直到有对象处理请求为止
- 角色:抽象处理者、具体处理者
- 优点
- 将发送者和处理者分开,请求者不需要知道谁来处理,发送者不需要知道请求者是谁
- 提高系统灵活性
- 缺点
- 使用场景
- 一个请求需要一系列处理工作
- 业务流程处理,比如审批
- 对系统进行补充扩展
- 策略模式
- 定义
- 也叫政策模式
- 定义一组算法,将每个算法封装起来,并且使它们之间可以相互转换
- 角色:环境、抽象策略、具体策略
- 优点
- 可以管理一组相关的算法
- 可以替换继承
- 可以避免使用多重条件转移语句
- 缺点
- 客户端必须知道所有的策略类
- 会造成很多策略类,可以使用享元模式解决
- 应用场景
- 多个类只是在算法上不一样
- 算法需要自由切换
- 需要屏蔽算法规则的场景
- 迭代器
- 定义
- 提供一种方法访问一个容器中的各个对象,而又不暴露该对象的内部细节
- 角色:抽象迭代器、具体迭代器、抽象聚类、具体聚类
- 优点
- 简化了访问容器元素的操作,具备了一个统一的遍历接口
- 封装遍历算法,使算法独立于聚类角色
- 缺点
- 让人产生序列化的错觉,从而产生错误
- 元素都是Object类型,没有类型特征(泛化可以解决问题)
- 应用场景
- Java集合框架中被广泛应用
- Java中一般不需要手动编写迭代器,JDK中自带的已经够用了
【读书笔记】设计模式第五章:行为型模式,布布扣,bubuko.com
【读书笔记】设计模式第五章:行为型模式
原文:http://blog.csdn.net/caipeichao2/article/details/25502805