简介
定义一个操作中的算法骨架即方法链,定义一些模板方法,将核心方法留给子类实现,子类在完成方法链的时候,可以调用模板方法,也可以覆写模板方法,执行业务的时候就会在自己的方法和模板方法中切换
例子
洗衣服接口
public interface Wash {
//执行洗衣服
void execute();
}
模板方法类
public abstract class AbstractWash implements Wash {
//使用protected的,子类可以进行调用覆写,外部不能调用
protected void before() {
System.out.println("拿出洗衣机,插上电源。。。。");
}
protected void after() {
System.out.println("拔掉电源,收拾好洗衣机。。。。");
}
//具体的抽象方法子类进行实现
public abstract void doWash();
@Override
public final void execute() {
//方法链子,使用多态进行方法选择
this.before();
this.doWash();
this.after();
}
}
自动洗衣机实现类
//全自动洗衣机
public class Automatic extends AbstractWash {
@Override
public void doWash() {
System.out.println("使用全自动洗衣机。。。。");
}
}
普通洗衣机实现类
//普通洗衣机
public class Matic extends AbstractWash {
@Override
public void doWash() {
System.out.println("使用普通洗衣机。。。。");
}
}
手洗实现类
//我自己手洗
public class MyMatic extends AbstractWash {
//核心方法必须进行覆写
@Override
public void doWash() {
System.out.println("使用手洗。。。。。");
}
//这里也可以只覆写一个方法,根据实际需要进行覆写
//使用我自己的before方法,不使用模板方法
@Override
protected void before() {
System.out.println("拿出洗衣板。。。。");
}
//使用我自己的after方法,不使用模板方法
@Override
protected void after() {
System.out.println("洗完以后发个朋友圈。。。");
}
}
测试
public class Main {
public static void main(String[] args) {
Wash automatic = new Automatic();
automatic.execute();
// 拿出洗衣机,插上电源。。。。
// 使用全自动洗衣机。。。。
// 拔掉电源,收拾好洗衣机。。。。
Wash matic = new Matic();
matic.execute();
// 拿出洗衣机,插上电源。。。。
// 使用普通洗衣机。。。。
// 拔掉电源,收拾好洗衣机。。。。
Wash myMatic = new MyMatic();
myMatic.execute();
// 拿出洗衣板。。。。
// 使用手洗。。。。。
// 洗完以后发个朋友圈。。。
}
}