模板方法模式
2018-11-20 本文已影响0人
cjxz
模板方法模式
- 父类抽象出子类共有的方法,并且自己实现他
- 子类实现各自不同的业务
- 父类实现的方法按照一定的逻辑调用抽象方法
- 为了反之子类重写父类实现的方法父类定义为final方法
以上就是一个基本的模板方法。存在一个问题,父类按顺序调用的过程无法定制。也就是所有的子类都是按照固定的顺序执行自己的方法。所以需要钩子方法来动态的改变父类执行方法的流程
- 在父类中增加一个钩子方法,提供默认的实现
- 在父类中final方法可以判断一下这个钩子方法的逻辑,最终决定是否需要改变方法的顺序
- 子类可以重写钩子方法,进而达到动态改变父类执行方法的顺序
模板方法是一个很简单的设计模式,通过下面简单的实例来说明模板方法模式

package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public abstract class AbstractCar {
private boolean didiFlag = true;
protected abstract void star();
protected abstract void didi();
protected abstract void shaChe();
protected abstract void stop();
public final void run(){
//按照固定顺序执行
this.star();
//判断是否设置了钩子属性
if(didiFlag){
this.didi();
}
this.shaChe();
this.stop();
}
//钩子方法,子类可以设置属性动态的改变父类执行的顺序
public void isDiDi(boolean didi){
didiFlag = didi;
}
}
抽象的父类实现类run方法,run方法的逻辑是固定的按照已经设置好的顺序执行,并且提供了一个钩子方法,让子类来操作是否需要嘀嘀作响的声音
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public class BMWCar extends AbstractCar {
@Override
protected void star() {
System.out.println("宝马一键启动");
}
@Override
protected void didi() {
System.out.println("遇上碰瓷的,按喇叭");
}
@Override
protected void shaChe() {
System.out.println("试试刹车");
}
@Override
protected void stop() {
System.out.println("到达目的地,熄火");
}
}
实现了一个宝马的小汽车,具体如何启动,如何响都由自己决定
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public class BenchiCar extends AbstractCar {
@Override
protected void star() {
System.out.println("奔驰一键启动");
}
@Override
protected void didi() {
System.out.println("开车喇叭就响");
}
@Override
protected void shaChe() {
System.out.println("刹车很灵");
}
@Override
protected void stop() {
System.out.println("到达目的地,熄火");
}
}
实现奔驰汽车,同样的可以自己决定自己的启动,响声
package com.pattern.template;
/**
* @Author: chao.zhu
* @description:
* @CreateDate: 2018/11/20
* @Version: 1.0
*/
public class Client {
public static void main(String[] args) {
AbstractCar bmw = new BMWCar();
bmw.run();
AbstractCar benchi = new BenchiCar();
//调用钩子方法改变run执行的顺序
benchi.isDiDi(false);
benchi.run();
}
}
可以通过钩子方法改变父类执行方法的顺序