Java設計模式--模板方法模式

來源:互聯網
上載者:User

標籤:ora   replace   wal   fast   car   開始   tle   穩定性   new   

  定義:

  模板模式是一種行為設計模式,使用了JAVA的繼承機制,在抽象類別中定義一個模板方法,該方法引用了若干個抽象方法(由子類實現)或具體方法(子類可以覆蓋重寫)。它的實現思路是,建立一個樁方法,並且定義一些步驟讓子類來實現。模板方法定義了一個演算法的執行步驟,或者說能夠提供一種預設的實現,這種實現概括一部分子類或者全部子類的共同部分。

  舉一個例子協助理解,假設提供一種造房子的演算法。演算法的步驟就是類比造房子的過程:建地基、建支撐,最後添加牆和窗戶 – 1. Fundation,2. Pillars,3. Walls,4. Windows。最重要的一點就是不能改變此建造過程,比如不可能在沒用地基的時候就開始建造窗戶。這個例子中,我們就建立了一個模板方法 – 將使用不同的方法完成對房子的建造。

  為了確保子類不能重寫(override)這個模板方法,應當使用final

模式中的角色

抽象模板:定義了一個模板方法和若干抽象方法和具體方法.

具體模板:繼承抽象模板類並實現抽象方法.

樣本:類比程式員的日常

抽象模板

package com.pichen.dp.behavioralpattern.templatemethod;public abstract class Day {    public void getUp(){        System.out.println("get up~");    }    public abstract void breakfast();    public abstract void goToWork();    public abstract void working();    public abstract void lunch();    public abstract void goHome();    public abstract void supper();    public void sleep(){        System.out.println("sleep~");    }    //模板方法    public final void process(){        getUp();        breakfast();        goToWork();        working();        lunch();        working();        goHome();        supper();        sleep();    }}

 具體模板

package com.pichen.dp.behavioralpattern.templatemethod;public class ProgrammerDay extends Day{    /**     * @see com.pichen.dp.behavioralpattern.templatemethod.Day#breakfast()     */    @Override    public void breakfast() {        System.out.println("breakfast:noodle~");            }    /**     * @see com.pichen.dp.behavioralpattern.templatemethod.Day#goToWork()     */    @Override    public void goToWork() {        System.out.println("goToWork:drive car~");            }    /**     * @see com.pichen.dp.behavioralpattern.templatemethod.Day#working()     */    @Override    public void working() {        System.out.println("working: coding~");            }    /**     * @see com.pichen.dp.behavioralpattern.templatemethod.Day#lunch()     */    @Override    public void lunch() {        System.out.println("lunch: eat rice~");            }    /**     * @see com.pichen.dp.behavioralpattern.templatemethod.Day#goHome()     */    @Override    public void goHome() {        System.out.println("goHome: walk~");    }    /**     * @see com.pichen.dp.behavioralpattern.templatemethod.Day#supper()     */    @Override    public void supper() {        System.out.println("supper: rice~");    }}

用戶端

package com.pichen.dp.behavioralpattern.templatemethod;public class Main {    public static void main(String[] args) {        Day programmerDay = new ProgrammerDay();        programmerDay.process();    }}

結果

get up~breakfast:noodle~goToWork:drive car~working: coding~lunch: eat rice~working: coding~goHome: walk~supper: rice~sleep~

模版方法模式的結構

       模版方法模式由一個抽象類別和一個(或一組)實作類別通過繼承結構組成,抽象類別中的方法分為三種:

  • 抽象方法:父類中只聲明但不加以實現,而是定義好規範,然後由它的子類去實現。
  • 模版方法:由抽象類別聲明並加以實現。一般來說,模版方法調用抽象方法來完成主要的邏輯功能,並且,模版方法大多會定義為final類型,指明主要的邏輯功能在子類中不能被重寫。
  • 鉤子方法:由抽象類別聲明並加以實現。但是子類可以去擴充,子類可以通過擴充鉤子方法來影響模版方法的邏輯。
  • 抽象類別的任務是搭建邏輯的架構,通常由經驗豐富的人員編寫,因為抽象類別的好壞直接決定了程式是否穩定性。

       實作類別用來實現細節。抽象類別中的模版方法正是通過實作類別擴充的方法來完成商務邏輯。只要實作類別中的擴充方法通過了單元測試,在模版方法正確的前提下,整體功能一般不會出現大的錯誤。

 

優點

       容易擴充。一般來說,抽象類別中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過增加實作類別一般可以很容易實現功能的擴充,符合開閉原則。

       便於維護。對於模版方法模式來說,正是由於他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的代碼散亂的分布在不同的類中,維護起來是非常不方便的。

       比較靈活。因為有鉤子方法,因此,子類的實現也可以影響父類中主邏輯的運行。但是,在靈活的同時,由於子類影響到了父類,違反了裡氏替換原則,也會給程式帶來風險。這就對抽象類別的設計有了更高的要求。

       在多個子類擁有相同的方法,並且這些方法邏輯相同時,可以考慮使用模版方法模式。在程式的主架構相同,細節不同的場合下,也比較適合使用這種模式

 

Java設計模式--模板方法模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.