模板模式:模板模式指的是定义一个算法骨架,将算法的实现延迟到子类中实现。
通俗理解:就是把一个业务流程中不变的功能写固定,只把变化不确定的那部分功能在骨架方法中抽象,并在继承我们的骨架,并实现在骨架类中的抽象方法。例如去银行办理业务,要经过3个流程:取号—–>办卡/存钱/取钱—–>对银行柜员进行评价,对于取号和评价来说在流程中时固定的,其中从取号到评价这个过程就是我们的骨架方法,办卡/存钱/取钱就是我们的变化的功能,需要抽象化,让子类具体去实现。
优点:
(1)可以实现对不变代码的复用,减少代码代码量,提高开发效率
(2)可以满足用户灵活多变的需求
(3)符合开闭原则:对扩展开放,对修改关闭
缺点:
骨架发生改变时,具体的抽象方法也要发生改变
例子:
骨架方法:
package cn.partten.lpq4;
//设计模式–模板模式–定义一个算法模板,将算法的延迟到子类中去实现,符合开闭原则:扩展开发,修改关闭
//可以灵活地满足用户多变的需求,但骨架一旦改变,抽象的方法也要改变
public abstract class BankTemplateMethod {
public void gotoBank(){//骨架方法
//具体的流程
takeNumber();//取号
process();//银行业务:取钱、存钱或者办卡–抽象可变的方法
evaluate();//评价
}
private void takeNumber() {
//取号的具体实现方法,是固定的
}
private void evaluate() {
//在银行办理完业务后对服务进行评价,也是固定的
}
public abstract void process() ;//进入银行需要办理怎样的业务,是不确定的所以抽象
}
抽象类方法:办卡–具体实现
package cn.partten.lpq4;
public class GetCard extends BankTemplateMethod {
public void process(){
//具体办卡的代码实现
}
}
抽象类方法:存钱–具体实现
package cn.partten.lpq4;
public class SaveMoney extends BankTemplateMethod{
public void process(){
//具体存钱的代码实现
}
}
抽象类方法:取钱–具体实现
package cn.partten.lpq4;
public class takeMoney extends BankTemplateMethod {
public void process(){
//具体取钱的代码实现
}
}
实例化子类–具体调用哪一个抽象类方法(要用到哪个功能)
package cn.partten.lpq4;
public class TestDemo {
public static void main(String[] args) {
BankTemplateMethod bt=new GetCard();//多态,实例化办卡功能
bt.process();//调用骨架中抽象方法
bt=new SaveMoney();//多态,实例化存钱功能
bt.process();
bt=new takeMoney();//多态,实例化取钱功能
bt.process();
}
}