模板方法模式是什么?
简单来说,就是把重复的方法或固定的行为顺序封装成接口,个性部分由子类来实现即可!
通过案例来理解模板方法模式
通过银行取款或者存款的流程(取号,等待,取款/存款,评价)来理解模板方法模式!
1、首先定义父类,来吧一些公共的方法,行为顺序抽象出来!
/**
* 父类:定义一些公共的方法及行为!
* 公共方法:取号,等待,评价
* 需要子类实现的方法:存款/取款
* 行为:第一步取号,第二步等待,第三步存款/取款,第四步:评价
*/
abstract class Business{
private Integer serialNo;
/**
* 取号
*/
public final void takeNumber(){
System.out.println("我来取号了~~~");
Random random = new Random();
this.serialNo = random.nextInt(100);
System.out.println("取到的号码为:" + this.serialNo);
}
/**
* 等待
* @param serialNo
*/
public final void waiting(Integer serialNo){
System.out.println(serialNo.intValue() + "号,在等待被叫那~~~");
}
/**
* 需要子类实现的存取款
* @param serialNo
*/
abstract void sonShowTime(Integer serialNo);
/**
* 钩子函数,用来逻辑判断,给个默认值,防止程序报错!
* @return
*/
public Boolean isGoodEvaluate(){
return true;
}
public final void evaluate(Integer serialNo){
if (isGoodEvaluate()){
System.out.println(serialNo.intValue() + "号给了五星好评!");
}else{
System.out.println(serialNo.intValue() + "号给了差评差评差评!");
}
}
/**
* 流程顺序
*/
public final void process(){
this.takeNumber();
this.waiting(serialNo);
this.sonShowTime(serialNo);
this.evaluate(serialNo);
}
}
2、子类根据自己的需要来实现相应的功能
/**
* 存款
*/
class Deposit extends Business{
@Override
void sonShowTime(Integer serialNo) {
System.out.println(serialNo + "号来存款了~");
}
@Override
public Boolean isGoodEvaluate(){
return true;
}
}
/**
* 取款
*/
class WithdarwMoney extends Business{
@Override
void sonShowTime(Integer serialNo) {
System.out.println(serialNo + "号来取款了~");
}
@Override
public Boolean isGoodEvaluate(){
return false;
}
}
3、测试调用
public class TemplateDemo {
public static void main(String[] args) {
Deposit deposit = new Deposit();
deposit.process();
System.out.println("-------------------------");
WithdarwMoney withdarwMoney = new WithdarwMoney();
withdarwMoney.process();
}
}
模板方法模式的优缺点有哪些?
优点:
- 行为统一由父类控制,子类来实现细节,符合开闭原则!
- 通过抽取重复部分,提高了代码的复用性
缺点:
- 如果父类添加新的方法,则可能造成牵一发而动全身
- 如果子类太多,会提升阅读的复杂性
感谢大家的阅读,我是爱你三千遍,一个喜欢把简单问题复杂化,把复杂问题简单化的程序猿! ❤