模板模式

  在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

  场景:总部设计的宝马车的模型模板,由各个分厂去根据抽象方法实现不同的车型,比如车的启动有多种不同实现,车的喇叭系统有多种不同实现,车的导航和自动停车可以有多种不同实现

     但最终一辆车的运作,是以启动——鸣笛注意——导航——停车的固定流程去走的,所以需要严格按照宝马规定的流程来走

  抽象模板类:

/**
 * 场景:总部设计的宝马车的模型模板
 * 由各个分厂去根据抽象方法实现不同的车型
 * @author test11
 */
public abstract class BMWTemplate {

    /**
     * 车的启动程序
     */
    public abstract void start();

    /**
     * 车的喇叭系统
     */
    public abstract void alarm();

    /**
     * 车的导航系统
     */
    public abstract void guide();

    /**
     * 停车
     */
    public abstract void stop();


    /**
     * 每辆上路跑的汽车,流程上是一样的,所以固化为模板
     */
    public void run(){
        this.start();

        this.alarm();

        this.guide();

        this.stop();
    }

}

  模板的实现BMWCar1

/**
 * 基于总部提供的模板实现的BMWCar1
 * @author test11
 */
public class BMWCar1 extends BMWTemplate{

    @Override
    public void start() {
        System.out.println("BMWCar1启动");
    }

    @Override
    public void alarm() {
        System.out.println("BMWCar1鸣笛");
    }

    @Override
    public void guide() {
        System.out.println("BMWCar1导航");
    }

    @Override
    public void stop() {
        System.out.println("BMWCar1停车");
    }
}

  模板的实现BMWCar2

/**
 * 基于总部提供的模板实现的BMWCar2
 * @author test11
 */
public class BMWCar2 extends BMWTemplate{

    @Override
    public void start() {
        System.out.println("BMWCar2启动");
    }

    @Override
    public void alarm() {
        System.out.println("BMWCar2鸣笛");
    }

    @Override
    public void guide() {
        System.out.println("BMWCar2导航");
    }

    @Override
    public void stop() {
        System.out.println("BMWCar2停车");
    }
}

  模板模式用户测试

/**
 * 模板模式测试
 * @author test11
 */
public class Demo {

    public static void main(String[] args) {
        //车型1测试
        BMWCar1 car1 = new BMWCar1();
        car1.run();


        //车型2测试
        BMWCar2 car2 = new BMWCar2();
        car2.run();
    }
}

 

posted @ 2021-05-19 18:06  纪煜楷  阅读(96)  评论(0编辑  收藏  举报