设计模式学习之模版方法模式
模版方法模式定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
模版方法很简单,平时我们可能不再没意识中就使用到了,模版方法的方法分为两类:
基本方法:基本方法也叫做基本操作,是由子类实现的方法,并且在模版方法(父类的方法)被调用。
模版方法:可以有一个或者多个,一般是一个具体实现的方法,实现对基本方法的调度,完成固定的逻辑
模板方法模式的优点:
- 封装不变的部分,扩展可变的部分
- 提取公共部分的代码,便于维护
- 行为由父类控制,子类负责实现基本方法
模版方法模式的使用场景:
- 多个子类有公有的方法,并且逻辑基本相同时可以使用
- 重要、复杂的算法,可以把核心算法设计为模版方法,周边的相关细节功能则由各个子类实现
- 重构时,模版方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过子类约束其行为。
/** * @author Lin * @Date 2017/11/16. * @Description 抽象悍马模型 */ public abstract class HummerModel { /** * 能启动 */ abstract void start(); /** * 能停止 */ abstract void stop(); /** * 能打喇叭 */ abstract void alarm(); /** * 引擎能响 */ abstract void engineBoom(); /** * 能跑 */ public void run(){ this.start(); this.engineBoom(); this.alarm(); this.stop(); } }
/** * @author Lin * @Date 2017/11/16. */ public class HummerH1Model extends HummerModel { @Override void start() { System.out.println("悍马H1发动........"); } @Override void stop() { System.out.println("悍马H1熄火........"); } @Override void alarm() { System.out.println("悍马H1打喇叭........"); } @Override void engineBoom() { System.out.println("悍马H1引擎声音,轰轰轰......."); } } /** * @author Lin * @Date 2017/11/16. */ public class HummerH2Model extends HummerModel { @Override void start() { System.out.println("悍马H2发动........"); } @Override void stop() { System.out.println("悍马H2熄火........"); } @Override void alarm() { System.out.println("悍马H2打喇叭........"); } @Override void engineBoom() { System.out.println("悍马H2引擎声音,轰轰轰......."); } }
/** * @author Lin * @Date 2017/11/16. */ public class Client { public static void main(String[] args) { HummerModel h1 = new HummerH1Model(); h1.run(); HummerModel h2 = new HummerH2Model(); h2.run(); } }