Java經(jīng)典設(shè)計(jì)模式之模板方法模式定義與用法示例
本文實(shí)例講述了Java設(shè)計(jì)模式之模板方法模式。分享給大家供大家參考,具體如下:
我們在生活中,很多事情都包含特定的一些步驟。如去銀行辦理業(yè)務(wù),通常步驟的次序是:取號 –> 填單 –> 等待叫號–>辦理業(yè)務(wù)。這幾個步驟中,有的是不變的,比如取號,每個人都要取,但有的是要變的,比如都有填單,但是根據(jù)不同的業(yè)務(wù),填寫的單據(jù)不同。又比如我們外出吃飯,一般的步驟是:點(diǎn)餐–>等待–>吃飯–>付錢,也能發(fā)現(xiàn)同樣的規(guī)律。這樣的事情數(shù)不勝數(shù)。
項(xiàng)目開發(fā)中,也可能遇到這樣的情況,多個功能模塊,可能有相似或相同的操作步驟,只是其中某一環(huán)節(jié)或某一個步驟不相同,我們就可以抽取一個或多個公用的父類(模板),讓子類實(shí)現(xiàn)具體的方法。我們以去銀行辦理業(yè)務(wù)為例:
模擬抽象類:
/** * 模板方法模式的模板框架(以去銀行辦理業(yè)務(wù)為例) * @description: */ public abstract class TempletBankFrame { /* 比如:去柜臺辦理銀行卡業(yè)務(wù)* */ public final void handleBankCard() { /* 第一步:進(jìn)入銀行大廳取號* */ takeNumber(); /* 第二步:填寫辦理業(yè)務(wù)的相關(guān)單據(jù)* */ if(!isNeedThisMethod()){//特殊情況可以添加判斷,如我之前有填寫好單子,那今天就不必再填寫了 writeBill(); } /* 第三步:等待工作人員叫號* */ waitCall(); /* 第四步:辦理業(yè)務(wù)* */ handleCard(); } /* 取號步驟是不需要更改的,所以我們用private修飾* */ private void takeNumber() { System.out.println("辦理銀行業(yè)務(wù)請取號!"); } /* 辦理的業(yè)務(wù)不同,填寫的內(nèi)容不同,所以我們用protected修飾,讓子類去處理具體業(yè)務(wù)* */ protected abstract void writeBill(); /* 等待叫號步驟也是不需要更改的,所以我們用private修飾* */ private void waitCall() { System.out.println("辦理銀行業(yè)務(wù)請取號!"); } /* 辦理的業(yè)務(wù)不同,用protected修飾,讓子類去處理具體業(yè)務(wù)* */ protected abstract void handleCard(); /*定義一個鉤子方法:由抽象類聲明并實(shí)現(xiàn),而子類會加以擴(kuò)展。通常抽象類給出的實(shí)現(xiàn)是一個空實(shí)現(xiàn),作為方法的默認(rèn)實(shí)現(xiàn)。**/ protected abstract boolean isNeedThisMethod(); }
具體實(shí)現(xiàn)類:如辦理取錢
/** * 辦理取錢業(yè)務(wù) * @description: */ public class GetMoney extends TempletBankFrame { @Override protected void writeBill() { System.out.println("我在填寫取錢的單據(jù)!"); } @Override protected void handleCard() { System.out.println("我要取500萬大洋"); } @Override protected boolean isNeedThisMethod() { System.out.println("我已經(jīng)填寫過單子,今天就直接等待叫號了吧!"); return true; } }
具體實(shí)現(xiàn)類:如我是去辦銀行卡
/** * 辦理銀行卡 * @description: */ public class TackCard extends TempletBankFrame { @Override protected void writeBill() { System.out.println("我填寫的是辦理銀行卡單據(jù)"); } @Override protected void handleCard() { System.out.println("我在辦卡,即將完成!"); } @Override protected boolean isNeedThisMethod() { return false; } }
測試類
/** * 模板方法模式測試類 * @description: */ public class Test { public static void main(String[] args) { GetMoney money=new GetMoney(); money.handleBankCard();//調(diào)用模板中的辦理業(yè)務(wù)方法 System.out.println("———–分隔線—————-"); TackCard card=new TackCard(); card.handleBankCard(); } }
最后的輸出結(jié)果:
辦理銀行業(yè)務(wù)請取號! 我已經(jīng)填寫過單子,今天就直接等待叫號了吧! 辦理銀行業(yè)務(wù)請取號! 我要取500萬大洋 ———–分隔線—————- 辦理銀行業(yè)務(wù)請取號! 我填寫的是辦理銀行卡單據(jù) 辦理銀行業(yè)務(wù)請取號! 我在辦卡,即將完成!
更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Java發(fā)送帶html標(biāo)簽內(nèi)容的郵件實(shí)例代碼
下面小編就為大家?guī)硪黄狫ava發(fā)送帶html標(biāo)簽內(nèi)容的郵件實(shí)例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11JAVA spark創(chuàng)建DataFrame的方法
這篇文章主要介紹了JAVA spark創(chuàng)建DataFrame的方法,幫助大家更好的理解和學(xué)習(xí)spark,感興趣的朋友可以了解下2020-08-08Swagger實(shí)現(xiàn)動態(tài)條件注入與全局?jǐn)r截功能詳細(xì)流程
這篇文章主要介紹了Swagger實(shí)現(xiàn)動態(tài)條件注入與全局?jǐn)r截功能詳細(xì)流程,Swagger 可以提供 API 操作的測試文檔,本文記錄 Swagger 使用過程中遇到的小問題2023-01-01SpringBoot--Banner的定制和關(guān)閉操作
這篇文章主要介紹了SpringBoot--Banner的定制和關(guān)閉操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2018-05-05