模式定義:
定義一個操作中算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
模式結(jié)構(gòu)
模式結(jié)構(gòu)
代碼實現(xiàn)-抽象類
public abstract class BankTemplateMethod {
public void takeNumber(){
System.out.println("取號");
}
public abstract void transact();//具體業(yè)務(wù)
public void evaluate(){
System.out.println("反饋評價");
}
public final void process(){
takeNumber();
transact();
evaluate();
}
}
public class Drawback extends BankTemplateMethod {
@Override
public void transact() {
System.out.println("取錢");
}
}
public class Client {
public static void main(String[] args) {
Drawback drawback = new Drawback();
drawback.process();
System.out.println("-----------");
BankTemplateMethod saveBack = new BankTemplateMethod() {
@Override
public void transact() {
System.out.println("存錢");
}
};
saveBack.process();
}
}
代碼實現(xiàn)-回調(diào)
public class BankTemplateMethod {
public void takeNumber() {
System.out.println("取號");
}
public void evaluate() {
System.out.println("反饋評價");
}
public final void process(BackBizCallBack callBack) {
takeNumber();
callBack.transact();//具體業(yè)務(wù)實現(xiàn)抽取到接口中
evaluate();
}
}
public interface BackBizCallBack {
public void transact();//具體業(yè)務(wù)
}
public class Client {
//取錢
public static void draw() {
new BankTemplateMethod().process(new BackBizCallBack() {
public void transact() {
System.out.println("取錢");
}
});
}
//掛失
public static void loseCard() {
new BankTemplateMethod().process(new BackBizCallBack() {
public void transact() {
System.out.println("掛失卡");
}
});
}
public static void main(String[] args) {
draw();
System.out.println("----------------------");
loseCard();
}
}
模式的優(yōu)缺點
模式的優(yōu)點
- 實現(xiàn)代碼復(fù)用。
模式的缺點
- 算法骨架不容易升級。
思考
模式本質(zhì):固定算法骨架。
開發(fā)中的應(yīng)用場景:
需要固定定義算法骨架,實現(xiàn)一個算法的不變部分,并把可變的行為留給子類來實現(xiàn)的情況。
各個子類中具有公共行為,應(yīng)該抽取出來,集中在一個公共類中去實現(xiàn),從而避免代碼的重復(fù)。
需要控制子類擴展的情況。模版方法模式會在特定的點來調(diào)用子類的方法,這樣只允許在這些點進行擴展。