设计模式

模板方法模式

2018-11-20  本文已影响0人  cjxz

模板方法模式

  • 父类抽象出子类共有的方法,并且自己实现他
  • 子类实现各自不同的业务
  • 父类实现的方法按照一定的逻辑调用抽象方法
  • 为了反之子类重写父类实现的方法父类定义为final方法

以上就是一个基本的模板方法。存在一个问题,父类按顺序调用的过程无法定制。也就是所有的子类都是按照固定的顺序执行自己的方法。所以需要钩子方法来动态的改变父类执行方法的流程

  • 在父类中增加一个钩子方法,提供默认的实现
  • 在父类中final方法可以判断一下这个钩子方法的逻辑,最终决定是否需要改变方法的顺序
  • 子类可以重写钩子方法,进而达到动态改变父类执行方法的顺序

模板方法是一个很简单的设计模式,通过下面简单的实例来说明模板方法模式


类图.png
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();
    }
}

可以通过钩子方法改变父类执行方法的顺序

上一篇 下一篇

猜你喜欢

热点阅读