1. 程式人生 > >面向對象編程思想-模板方法模式

面向對象編程思想-模板方法模式

uid 導致 是否 img start set ctc else 感謝

一、引言

說到模板,顧名思義:就是樣板,整體架構已經有了,你只需要填充自己的特定內容就可以了。如:簡歷模板,論文模板,PPT模板等

在軟件設計中,模板方法模式與之很相似,下面請看我們今天要學習的模板方法模式

二、模板方法模式

定義:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟

下面結構圖:

技術分享

抽象模板角色(AbstractClass):在抽象類中定義一個或多個基本操作,每一個操作對應算法中一個步驟;同時提供一個模板方法用戶定義基本方法的操作次序,而通過子類覆寫某些步驟,從而使得相同的算法框架可以有不同的執行結果

具體模板角色(Concrete)

:實現父類中聲明的抽象基本操作以完成子類特定算法的步驟

場景:公司要為銀行做一個利息計算系統,流程首先驗證用戶登錄是否正確,如果登錄失敗提示錯誤信息,然後如果登錄成功,根據用戶不同類型使用不同計算公式計算利息,最後展示利息計算結果

下面該業務場景demo:

技術分享
    abstract class Account
    {
        //基本方法-具體方法
        public bool validate(string uid,string password)
        {
            Console.WriteLine($"uid is {uid},pwd is {password}
"); if(uid.Equals("michael")&&password.Equals("123456")) { return true; } else { return false; } } //基本方法-抽象方法 public abstract void Calculate(); //基本方法-具體方法 public void Display() { Console.WriteLine(
"顯示利息"); } //模板方法 public void Handle(string uid, string password) { if(!validate(uid, password)) { Console.WriteLine("您輸入的賬號密碼有誤"); return; } Calculate(); Display(); } class CurrentAccount : Account { //覆寫父類抽象的基本方法 public override void Calculate() { Console.WriteLine("請使用活期利率計算利息"); } } class RegularAccount : Account { public override void Calculate() { Console.WriteLine("請使用定期利率計算利息"); } } static void Main(string[] args) { string type= ConfigurationManager.AppSettings["account"]; object obj= Assembly.Load("TemplateMethodPattern").CreateInstance(type); (obj as Account).Handle("michael", "123456"); Console.Read(); } //xml配置項 <?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <appSettings> <add key="account" value="TemplateMethodPattern.CurrentAccount"/> </appSettings> </configuration>
View Code

技術分享

分析:該業務場景中不管定期還是活期,檢查用戶登錄和展示算法結果都是相同的,所以可以把相同部分抽象出來到抽象類中去定義,具體不同部分可以到具體的子類中去實現。盡可能的把相同部分抽象到了上端,也很好的符合了開閉原則。

優點:

1.提高了代碼復用性

2.能靈活應對子步驟的變化,符合開放-封閉原則

缺點:

1.需要為每一個基本方法的不同實現提供一個子類,如果抽象模板類中可變基本方法很多,導致子類龐大,系統復雜度提高

使用場景:

1.將一些復雜的算法進行分割,將算法中固定的方法設計為模板方法和父類具體方法,將一些可以改變的細節交予子類中實現;

2..如:NET開發自定控件,我們只需要覆寫控件中的部分方法

行為型設計模式之模板方法的學習就到此結束了,希望能夠幫到你,若有不足,歡迎斧正,感謝您的閱讀。

面向對象編程思想-模板方法模式