模板模式
在模板模式(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(); } }