"围观"设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)
2016-06-06 21:25
567 查看
模板方法模式定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。让子类别在不改变算法架构的情况下,重新定义算法中的某些步骤。----WIKIPEDIA
场景介绍:汽车,无非是启动、开路、停车,就这几部,对于这样的流程基本上固定的行为我们可以考虑采用模板方法模式来进行设计。
类的结构图
主要代码
抽象类
2. 提取公共部分代码,便于维护。
3. 行为由父类控制,子类实现,基本方法时由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。
2. 重构,将相同的代码抽取到父类中。
[b]"围观"设计模式(17)--结构型之享元模式(Flyweight Pattern)
[/b]
个人理解
模板方法模式相对而言比较简单,一般的都是由抽象类定义好模板方法,然后,子类通过继承并实现其父类中定义好的模板中需要执行的具体的方法,调用子类对象的模板方法时,会执行该类中的具体实现的方法。这个模式我个人的感觉有点像是面向过程的操作,执行完一道工序,接着下一道工序。案例解析
模板方法相对来说比较简单,这里只列举一个例子供大家参考下。场景介绍:汽车,无非是启动、开路、停车,就这几部,对于这样的流程基本上固定的行为我们可以考虑采用模板方法模式来进行设计。
类的结构图
主要代码
抽象类
public abstract class Car { public abstract void startUp(); public abstract void run(); public abstract void stop(); public void templateMethod(){ this.startUp(); this.run(); this.stop(); } }实现类
public class BYDCar extends Car{ @Override public void startUp() { System.out.println("BYDCar 启动!"); } @Override public void run() { System.out.println("BYDCar 跑起来!"); } @Override public void stop() { System.out.println("BYDCar 停止!"); } }
public class HongQiCar extends Car{ @Override public void startUp() { System.out.println("HongQiCar 启动!"); } @Override public void run() { System.out.println("HongQiCar 跑起来!"); } @Override public void stop() { System.out.println("HongQiCar 停止!"); } }测试类
public class MainTest { public static void main(String[] args) { HongQiCar hongQiCar = new HongQiCar(); BYDCar byd = new BYDCar(); hongQiCar.templateMethod(); byd.templateMethod(); } }
模板方法模式优点
1. 封装不变部分,扩展可变部分:把认为不变的部分封装到父类去实现,可变的部分可以通过继承来继续扩展。2. 提取公共部分代码,便于维护。
3. 行为由父类控制,子类实现,基本方法时由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合开闭原则。
模板方法模式缺点
模板方法模式颠倒了阅读顺序,我们要想知道子类中模板方法的执行顺序需要去父类中查看,复杂的项目中造成代码阅读的难度。模板方法模式使用场景
1. 多个子类有共有的方法,并且逻辑基本上相同的时候。2. 重构,将相同的代码抽取到父类中。
源码下载
源码下载地址推荐阅读
"围观"设计模式(16)--结构型之组合模式(Composite Pattern)[b]"围观"设计模式(17)--结构型之享元模式(Flyweight Pattern)
[/b]
相关文章推荐
- python自身bug:file.tell()在Linux和window平台下返回不同的值
- 值得收藏的机器学习资源
- ESP8266-SDK的最小系统的接线图
- javascript-第五节-字符串、字符数组
- Leetcode-10. Regular Expression Matching
- 转载:程序集的查找顺序
- 深入理解C++的多态性
- 3、面向对象-继承-多态
- 哈夫曼树实现文件压缩与解压缩
- [置顶] 再谈对协变和逆变的理解
- 异常机制学习笔记
- java那些事情
- 关于python csv文件打开错误:_csv.Error: line contains NULL byte
- xcode UIButton创建、监听按钮点击、自定义按钮 、状态 、内边距
- 数据类型,隐式转换以及json,对象,引用类型,预解析 视频教程
- miniblink修复3D变换的两处渲染Bug
- SlidingMenu侧滑菜单
- [置顶] Java中的逆变与协变
- Codeforces 676C Vasya and String 尺取法
- java连接Sql server 2008步骤