【大話設計模式】—— 模板方法模式

weixin_34262482發表於2014-10-16

一、概念

  上一篇文章剛剛講了【大話設計模式】—— 原型模式,原型模式主要是通過Clone()方法,建立新的物件,免去了初始化的過程。模板方法模式也特別會“偷工減料”,把不變的行為搬移到超類,去除子類中的反覆程式碼,將程式碼的複用優勢展現的淋漓盡致。它為我們提供了特定的結構和樣式,我們僅僅需關心填充資料內容就好,省心啊~

  以下讓我們來看一下它的準確定義:

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


二、UML圖

抽象類(AbstractClass):

1)定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。2)定義並實現了一個模板方法,這個模板方法通常是一個詳細的方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在對應的抽象操作中,推遲到子類實現。


詳細類(ConcreteClass):

1)實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯在組成步驟。

2)每個抽象模板角色都能夠有隨意多個詳細模板角色與之相應,而每個詳細模板角色都能夠給出這些抽象方法的不同實現,從而使得頂級邏輯的實現各不同樣。


三、例項解析

  近期《分手大師》和《爸爸回來了》炒的非常厲害,當然這也引發了部分觀眾對當中男女主人公的好奇心,當然也包含我。。。不少的訪談節目大大剖析了國民男神—小鵬哥,無敵“賤”—鄧超的感情經歷。經本人常年研究發現,非常多男名人追老婆的步驟差點兒相同:1.一見鍾情(我猜鄧超說不定是“賤”。。。)2.兩情相悅 3.喜結連理(走進了“墳墓裡”,然後就沒有然後了~),可是他們追求嫂夫人的方式卻各不同樣。這正迎合了模板方法模式,定義了一個追求的骨架,詳細的步驟因人而異。

  以下請讚賞程式碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    class Program
    {
        //client程式碼
        static void Main(string[] args)
        {
            Console.WriteLine("李小鵬哥哥的求婚歷程:");
            ChasingGirl Lxp = new Lxp();
            Lxp.Part1();
            Lxp.Part2();
            Lxp.Part3();

            Console.WriteLine("鄧超哥哥的求婚歷程:");
            ChasingGirl Dc = new Dc();
            Dc.Part1();
            Dc.Part2();
            Dc.Part3();

            Console.Read();
        }
    }


   
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    
        //怎樣追女生呢?
        class ChasingGirl
        {
            //追女第一步 
            public void Part1()
            {
                Console.WriteLine("一見鍾情");
                Console.WriteLine("詳細措施:" + Measures1());
            }
            protected virtual string Measures1()
            {
                return "";
            }

            //追女第二步  
            public void Part2()
            {
                Console.WriteLine("兩情相悅");
                Console.WriteLine("詳細措施:" + Measures2());
            }
            protected virtual string Measures2()
            {
                return "";
            }

            //追女第三步
            public void Part3()
            {
                Console.WriteLine("喜結連理");
                Console.WriteLine("詳細措施:" + Measures3());
            }
            protected virtual string Measures3()
            {
                return "";
            }


        }
    
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    //李小鵬追老婆的詳細方式

    class Lxp : ChasingGirl
    {
        protected override string Measures1()
        {
            return "2003世錦賽3塊金牌,不只為了國家,也為了愛情";
        }
        protected override string Measures2()
        {
            return "為了愛情苦學英語,請英語老師補課,註冊了MSN,每天都與安琦相約在網上,用英語聊天。";
        }
        protected override string Measures3()
        {
            return "2010年6月3日,李小鵬與李安琪結束七年愛情長跑,邁入婚姻的殿堂";
        }
    }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    //鄧超追老婆的詳細方式
    class Dc : ChasingGirl
    {
        protected override string Measures1()
        {
            return "共同出演電視劇《幸福像花兒一樣》,有緣千里來相會";
        }
        protected override string Measures2()
        {
            return "戲裡“對手”戲外相知 ,有開心,也有小別扭";
        }
        protected override string Measures3()
        {
            return "情人節,送禮物,有情人終成眷屬";
        }
    }
}


追求歷程:



四、總結

  當我們要完畢某一細節層次一致的一個過程或一系列步驟,但其個別步驟在更具體的層次上的實現可能不同一時候,我們通常考慮用模板方法模式來處理。

  模板方法避免了子類中不變行為和可變行為的混合,幫助子類擺脫反覆不變行為的糾纏。

  看到模板方法模式,讓我心中小感慨了一下。從技術的角度看,它符合開閉原則,提高了程式設計效率;從生活角度來看,兒子繼承老子給的模板,也是父愛的一種表現吧。畢竟我們的起點是建立在家庭基礎之上的。可是父類卻沒有獨裁,沒有限制我們後來的發展,給了我們展示自我,突破自我的機會(也就是後來詳細實現的步驟延遲到了子類),感覺老爸真的非常無私,非常偉大!

  儘管父親節已過,但願祝福的不算太晚。祝全天下的爸爸,父親節快樂,身體健康!當然也包含給予我們父愛的米老師,謝謝您!

相關文章