详解模板方法设计模式
分享一波:程序員賺外快-必看的巔峰干貨
概念
定義一個(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)延遲到子類中定義。
案例流程
代碼案例
以發(fā)送短信為案例。在發(fā)送短信前后,需要進(jìn)行日志記錄。發(fā)送前記錄接收方號(hào)碼、發(fā)送時(shí)間、內(nèi)容,發(fā)送后需要記錄發(fā)送結(jié)果,這兩個(gè)步驟是固定的,而三大運(yùn)營(yíng)商發(fā)送短信的邏輯則可能有所不同,因此該方法作為抽象方法給運(yùn)營(yíng)商去實(shí)現(xiàn),代碼如下:
public abstract class MsgTemplate {
public void sendMsg() {//1.開始日志報(bào)文addHeadLog();//2.調(diào)用具體不通運(yùn)營(yíng)商發(fā)送短信httpRequest();//3.結(jié)束日志報(bào)文addFootLog(); }/*** 模板方法,子類去實(shí)現(xiàn)*/ abstract void httpRequest();private void addFootLog() {System.out.println("調(diào)用運(yùn)營(yíng)商結(jié)束記錄日志..."); }private void addHeadLog() {System.out.println("調(diào)用運(yùn)營(yíng)商開始記錄日志..."); }}
// -----
中間編寫實(shí)現(xiàn)類,移動(dòng)、聯(lián)通、電信三大運(yùn)營(yíng)商,繼承模板類重寫模板方法。
下面為調(diào)用示例,具體代碼不再編寫。
// ----
MsgTemplate yidong = new YiDong();
yidong.sendMsg();
與代理模式的異同
模板方法設(shè)計(jì)模式與代理設(shè)計(jì)模式都在方法前或后執(zhí)行了一些代碼邏輯,但是二者的核心思想差別很大
相同之處:模板方法設(shè)計(jì)模式與代理設(shè)計(jì)模式的相同之處在于,都在特定的方法前或后分別執(zhí)行了不同的邏輯。
不同之處:代理設(shè)計(jì)模式的思想是幫助被代理類去執(zhí)行某個(gè)方法,而這個(gè)方法與代理類是無關(guān)的。同時(shí),代理設(shè)計(jì)模式知道所代理的是哪些類。模板方法設(shè)計(jì)模式的思想是提供一套模板,其中一些步驟的代碼已經(jīng)得到了具體的實(shí)現(xiàn),而有部分代碼則交由子類去進(jìn)行實(shí)現(xiàn)。模板方法模式提供了一套模板,是提供者,子類則去實(shí)現(xiàn)相應(yīng)的抽象方法,而模板的提供者并不知道這套模板將來會(huì)被什么類去使用。
分享一波:程序員賺外快-必看的巔峰干貨
總結(jié)
以上是生活随笔為你收集整理的详解模板方法设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: /* compiled code */
- 下一篇: Mysql8.0Mysql5.7Mysq