模板模式适用于同一种流程有不同的实现方式的场景,比如春节回家,都会经历规划行程、选择交通工具、路线、到家这四个阶段,但是不同的人可能每个流程会不一样,比如时间规划有些人会请假,但是大部分人都会按照法定假日,然后交通工具不同的人有不同的选择,路线更是五花八门,可能最后到家这个步骤是一样的,我们理解成就是给家人见面
先定义一个基础模板类 BaseTemplate,列好具体实现步骤
/**
* 基础模板
*/
public abstract class BaseTemplate {
public void start(){
plan(); // 时间规划
traffic(); // 交通工具
route(); // 路线规划
home(); // 到家了
}
/**
* 时间规划
* 因为大部分人都是参照法定假日,所以这里可以直接在基础模板实现,如果有部分不一样的直接复写即可
*/
public void plan() {
System.out.println("法定假日是1.30号放假,2.10收假");
}
/**
* 交通工具
* 坐火车的人是大部分,所以可以直接实现坐火车的方法
*/
public void traffic() {
System.out.println("我坐火车回去了");
}
/**
* 路线选择
* 因为大家来自五湖四海,每个人的路线差异很大,这里就各自实现类去处理
*/
public abstract void route();
/**
* 到家
* 统一跟家里人吃饭
*/
public void home() {
System.out.println("到家吃饭了");
}
}
然后具体类继承这个模板,如果有方法跟模板不一样就自己复写
- zhangsan的返乡计划
/**
* zhangsan的春节返乡计划
* 只有路线不一样,其他的都使用通用模板
*/
public class ZhangSan extends BaseTemplate{
@Override
public void route() {
System.out.println("广州 --> 长沙 --> 呼和浩特");
}
}
- lisi的返乡计划
/**
* lisi的春节返乡计划
* 选择自己自驾回去,因为路程远,所以要请2天假
*/
public class LiSi extends BaseTemplate{
@Override
public void plan() {
System.out.println("我要请2天假,所以1.30回去,但是2.12回来");
}
@Override
public void traffic() {
System.out.println("我选择开自己的宝马回去");
}
@Override
public void route() {
System.out.println("广州 --> 石家庄 --> 鹤岗");
}
}
具体方法的执行
public class TemplateTest {
public static void main(String[] args) {
ZhangSan zhangSan = new ZhangSan();
System.out.println("========zhangsan的返乡计划开始========");
zhangSan.start();
System.out.println("========lisi的返乡计划开始========");
LiSi liSi = new LiSi();
liSi.start();
}
}