1. 程式人生 > >大話設計模式-Study-Tips-第七章-模板方法模式(c++&c#)

大話設計模式-Study-Tips-第七章-模板方法模式(c++&c#)

一、UML圖

二、包含的角色

AbstractClass是抽象類,其實也就是一個抽象模板,定義並實現一個模板方法。這個模板方法一般是一個具體方法,它給出了一個頂級的邏輯骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類中實現。

ConcreteClass,實現父類所定義的一個或者多個抽象方法。每個AbstractClass都可以有任意多個ConcreteClass與之對應,而每個ConcreteClass都可以給出這些抽象方法。

三、特點

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

1、模板方法模式就是通過把不變行為搬移到超類,去除子類的中的重複程式碼來體現它的又是。

2、模板方法模式就是提供一個很好的程式碼複用平臺

3、當不變和可變的行為在方法的子類實現中混合在一起的時候,不變的行為就會在子類中重複出現,我們可以通過模板方法模式把這些行為搬移到單一的地方,這樣就幫助子類擺脫重複的不變行為的糾纏。

四、程式碼實現

C#實現

AbstractClass類

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

    public void TemplateMethod() {
        PrimitiveOperation1();
        PrimitiveOperation2();
    }
}

ConcreteClass類 

public class ConcreteClass : AbstractClass {

    public void PrimitiveOperation1() {
        // TODO implement here
    }

    public void PrimitiveOperation2() {
        // TODO implement here
    }

}

frontend

AbstractClass c;

c = new ConcreateClassA();
c.TemplateMethod();

C++實現

AbstractClass類

class AbstractClass
{
  public:
    AbstractClass() {}
    virtual ~AbstractClass() {}

  public:
    virtual void PrimitiveOperation1()=0;

    virtual void PrimitiveOperation2()=0;

    void TemplateMethod()
    {
        PrimitiveOperation1();
        PrimitiveOperation2();
    }
};

ConcreteClass類 

class ConcreteClass : public AbstractClass
{
  public:
    ConcreteClass(){}
    ~ConcreteClass(){}

  public:
    void PrimitiveOperation1(){
        std::cout<<"PrimitiveOperation1"<<std::endl;
    }

    void PrimitiveOperation2(){
        std::cout<<"PrimitiveOperation2"<<std::endl;
    }
};

frontend呼叫

ConcreteClass c;
c.TemplateMethod();