模板方法模式:定義一個(gè)操作中的算法骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的
重復(fù)代碼全部在父類里面,不同業(yè)務(wù)的,抽取給子類進(jìn)行實(shí)現(xiàn)。抽取過程---抽象方法。
某些特定步驟。
核心:處理某個(gè)流程的代碼已經(jīng)都具備,但是其中某個(gè)節(jié)點(diǎn)的代碼暫時(shí)不能確定。因此,我們采用工廠方法模式,將這個(gè)節(jié)點(diǎn)的代碼實(shí)現(xiàn)轉(zhuǎn)移給
子類完成。即:處理步驟在父類中定義好,具體的實(shí)現(xiàn)延遲到子類中定義。
說白了,就是將一些相同操作的代碼,封裝成一個(gè)算法的骨架。核心的部分留在子類中操作,在父類中只把那些骨架做好。
例如:
1.去銀行辦業(yè)務(wù),銀行給我們提供了一個(gè)模板就是:先取號(hào),排對(duì),辦理業(yè)務(wù)(核心部分我們子類完成),給客服人員評(píng)分,完畢。
這里辦理業(yè)務(wù)是屬于子類來完成的,其他的取號(hào),排隊(duì),評(píng)分則是一個(gè)模板。
2.去餐廳吃飯,餐廳給提供的一套模板就是:先點(diǎn)餐,等待,吃飯(核心部分我們子類完成),買單
這里吃飯是屬于子類來完成的,其他的點(diǎn)餐,買單則是餐廳提供給我們客戶的一個(gè)模板。
//模板方法
public abstract class BankTemplateMethod {
// 1.取號(hào)排隊(duì)
public void takeNumber() {
System.out.println("取號(hào)排隊(duì)。。");
}
// 2.每個(gè)子類不同的業(yè)務(wù)實(shí)現(xiàn),由各自子類實(shí)現(xiàn).
abstract void transact();
// 3.評(píng)價(jià)
public void evaluate() {
System.out.println("反饋評(píng)價(jià)..");
}
public void process(){
takeNumber();
transact();
evaluate();
}
}
public class DrawMoney extends BankTemplateMethod {
@Override
void transact() {
System.out.println("我要取款");
}
}
public class Client {
public static void main(String[] args) {
BankTemplateMethod bankTemplate=new DrawMoney();
bankTemplate.process();
}
}
實(shí)現(xiàn)一些操作時(shí),整體步驟很固定,但是呢。就是其中一小部分容易變,這時(shí)候可以使用模板方法模式,將容易變的部分抽象出來,供子類實(shí)現(xiàn)。