模板方法模式的內容,其實從一開始接觸抽象類的知識時就有所涉及了。抽象類中可以定義具體的方法,也可以定義一些抽象方法。
繼承自該抽象類後,就會自動擁有具體方法,並且必須實現抽象類中的抽象方法。
想一想,其實抽象類可以讓我們實現一些「模板」,在這些模板中,我們可以先把所有子類都一樣的方法寫成具體方法,這樣子類繼承就能直接擁有。
我們可以定義一些抽象方法,由於每個子類的實現都有可能不同,所以我們讓每個子類自己去實現。
模板方法模式,解決的是一種特殊的場景,舉個例子。在某款遊戲中,玩家可以領取到許多不同的任務,這個過程中的順序是固定的——領取任務、完成任務、提交任務。只是有乙個部分不一樣,那就是完成任務的過程,這個過程是不確定的。
在這種場景下,我們就能這樣去設計。
public abstract class abstractfather
public void gettask()
abstract void dotask();
public void reftask()
}public class concretechild extends abstractfather
}public class test
}//測試結果
//您領取了任務
//更改了專案需求
//您提交了任務
通過這個案例中,我們介紹模板方法模式的兩種角色。
在模板方法模式中通常有兩種角色,一種是抽象類,一種是子類。
抽象類:抽象類中定義了乙個基本的演算法操作(演算法框架),就像上面的案例一樣,接任務 -> 完成任務 -> 提交任務,這就算是乙個基本的演算法操作。
並且,在抽象類中,定義了一些具體的方法,也定義了一些抽象的方法。
具體子類:可以呼叫、覆蓋、實現子類特定演算法的步驟,也可以覆蓋在父類中已經實現的具體基本操作。
此外,在抽象類中有時候還可以有乙個「鉤子」方法,這個鉤子方法可以用來控制步驟是否執行。
我們來看個栗子。
public abstract class abstractfather
reftask();
}private boolean checkhook()
public void gettask()
abstract void dotask();
public void reftask()
}
在這個抽象類中我們增加了乙個鉤子方法checkhook(),這個方法預設返回true,也就是預設要執行dotask()方法。
我們的子類繼承之後,如果不想執行這個步驟,就可以覆蓋掉這個checkhook()方法。
private boolean checkhook()
這樣就不會執行了。
模板方法模式是一種**復用技術,通過模板方法模式,我們能控制演算法的執行流程。如果有需要,還可以對原來的業務方法進行重寫。
重要的是,通過這個模式,我們可以輕易的自定義抽象方法中的業務,不必用大量if判斷來決定執行哪種業務方法。
2018/4/10 13:40:54 @author:雲都小生
模板設計模式 設計模式 模板方法模式
在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...
設計模式 模板方法設計模式
物件導向,萬物皆物件,用乙個雷來反應現實生活中的東西。比如銀行系統,業務公升級 活期 定期,差別很小,就加判斷 違背單一職責 差別比較多,尤其是模擬較複雜,型別拆分下。拆分之後,自然就有父類,重用。利率 每個客戶端都有利率,但是各不一樣 抽象方法。show 不分客戶端是一樣的,個別客戶端是不一樣的 ...
設計模式 模板方法模式
模板方法模式 類庫中大量使用,例如idbconnection介面 dbconnection抽象類 派生的sqlconnection和派生的oledbconnection就是使用了這種方法 1。介面,到能做的定義進來。一種規範 2.把共同的部分進去分離出來,放到乙個抽象的父類去實現.3.子類中實現 不...