設計模式(17)---模板方法模式

1、定義算法

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

解釋:簡單來講,須要定義一個通用的基類,可是基類中不一樣的操做,因而模板方法模式將不一樣的操做編寫成一個抽象函數放到子類中實現,這樣便可完成通用基類的目的。函數

 

2、UML類圖及基本代碼this

 

基本代碼:spa

abstract class AbstractClass
    {
        public abstract void PrimitiveOperation1();
        public abstract void PrimitiveOperation2();

        public void TemplateMethod()
        {
            PrimitiveOperation1();
            PrimitiveOperation2();
            Console.WriteLine("基類的行爲");
        }
    }

    class ConcreteClassA : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具體類A方法1的實現");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具體類A方法2的實現");
        }
    }

    class ConcreteClassB : AbstractClass
    {
        public override void PrimitiveOperation1()
        {
            Console.WriteLine("具體類B方法1的實現");
        }

        public override void PrimitiveOperation2()
        {
            Console.WriteLine("具體類B方法2的實現");
        }
    }

客戶端調用及結果:code

AbstractClass ac;
            ac = new ConcreteClassA();
            ac.TemplateMethod();

            Console.WriteLine("");
            ac = new ConcreteClassB();
            ac.TemplateMethod();
View Code

 

3、實例說明blog

平常生活中作菜這件事,雖然作不一樣的菜的方式不同,但絕大多數步驟是同樣的,本例用炒菠菜和炒白菜做爲實例進行說明模板方法模式,基本代碼以下:get

public abstract class Vegetable
    {
        public void CookVegetable()
        {
            Console.WriteLine("燒蔬菜的通常方法:");
            this.PoilOil();
            this.HeatOil();
            PourVegetable();
        }

        public void PoilOil()
        {
            Console.WriteLine("倒油");
        }

        public void HeatOil()
        {
            Console.WriteLine("把油燒熱");
        }

        public abstract void PourVegetable();
    }

    public class Spinach : Vegetable
    {
        public override void PourVegetable()
        {
            Console.WriteLine("菠菜倒進鍋中");
        }
    }

    public class Cabbage : Vegetable
    {
        public override void PourVegetable()
        {
            Console.WriteLine("白菜倒進鍋中");
        }
    }
View Code

 

客戶端調用及運行結果:it

Vegetable sp = new Spinach();
            sp.CookVegetable();

 

4、優缺點及適用場景io

優勢:

1)實現了代碼複用

2)可以靈活應對子類步驟的變化,符合開放-封閉原則

即:封裝不變部分,擴展可變部分。 二、提取公共代碼,便於維護。 三、行爲由父類控制,子類實現。

缺點:

引入了一個抽象類,使系統邏輯更加複雜。

 

適用場景:

模板方法模式經過把不變的行爲搬移到超類,去除子類中的重複代碼來體現其優點。所以凡是能體現此優勢的地方均可以使用模板方法模式。

相關文章
相關標籤/搜索