TemplateDemo.java
package com.csdn.demo;
/**
* 模板方法模式。
* 流程固定,具体操作不同。可用模板方法模式
* 1.抽象模板(定义了流程的具体方法)
* 2.具体模板实现抽象模板
* @author Administrator
*
*/
//模板方法
abstract class Template{
abstract protected void openDoor();
//具体方法
private void sit(){
System.out.println("坐在座位上");
}
//具体方法
private void wearSeatBelts(){
System.out.println("系安全带");
}
//抽象方法
abstract protected void driver(String destination);
//具体方法
private void stop(){
System.out.println("停车到达");
}
//模板方法,不能重写
public final void go(String destination){
openDoor();
sit();
wearSeatBelts();
refuel();
driver(destination);
stop();
}
//钩子方法。可实现可不实现
protected void refuel(){}
}
//具体模板实现类
class DriverTemplate extends Template{
//实现抽象方法
@Override
protected void openDoor() {
System.out.println("用遥控锁开门");
}
//实现抽象方法
@Override
protected void driver(String destination) {
System.out.println("开车去"+destination);
}
protected void refuel(){
System.out.println("去目的地前前加油");
}
}
//具体模板实现类
class DriverTemplate2 extends Template{
//实现抽象方法
@Override
protected void openDoor() {
System.out.println("直接开门");
}
//实现抽象方法
@Override
protected void driver(String destination) {
System.out.println("开车去"+destination);
}
}
public class TemplateDemo {
public static void main(String[] args) {
Template driver = new DriverTemplate();
driver.go("北京");
//要不要加油取决于实现类是否实现加油方法
driver = new DriverTemplate2();
driver.go("4s店");
}
}