1. 程式人生 > >設計模式—Template Method(模板方法)

設計模式—Template Method(模板方法)

動機(Motivation)

  • 在軟體構建過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因(比如框架與應用之間的關係)而無法和任務的整體結構同時實現。
  • 如何在確定穩定操作結構的前提下,來靈活應對各個子步驟的變化或者晚期實現需求?

模式定義

定義一個操作中的演算法的骨架 (穩定) ,而將一些步驟延遲 (變化) 到子類中。 Template Method使得子類可以不改變(複用)一個演算法的結構即可重定義(override 重寫)該演算法的 某些特定步驟。 ——《 設計模式》 GoF

在這裡插入圖片描述

結構化設計流程程式碼(早繫結)

//程式庫開發人員
class Library{

public:
	void Step1(){
		//...
	}

    void Step3(){
		//...
    }

    void Step5(){
		//...
    }
};
//應用程式開發人員
class Application{
public:
	bool Step2(){
		//...
    }

    void Step4(){
		//...
    }
};

int main()
{
	Library lib();
	Application app();

	lib.Step1();

	if (app.Step2()){
		lib.Step3();
	}

	for (int i = 0; i < 4; i++){
		app.Step4();
	}

	lib.Step5();

}

在這裡插入圖片描述

面向物件軟體設計流程程式碼(晚繫結)

//程式庫開發人員
class Library{
public:
	//穩定 template method
    void Run(){
        
        Step1();

        if (Step2()) { //支援變化 ==> 虛擬函式的多型呼叫
            Step3(); 
        }

        for (int i = 0; i < 4; i++){
            Step4(); //支援變化 ==> 虛擬函式的多型呼叫
        }

        Step5();

    }
	virtual ~Library(){ }

protected:
	
	void Step1() { //穩定
        //.....
    }
	void Step3() {//穩定
        //.....
    }
	void Step5() { //穩定
		//.....
	}

	virtual bool Step2() = 0;//變化
    virtual void Step4() =0; //變化
};
//應用程式開發人員
class Application : public Library {
protected:
	virtual bool Step2(){
		//... 子類重寫實現
    }

    virtual void Step4() {
		//... 子類重寫實現
    }
};




int main()
	{
	    Library* pLib=new Application();
	    lib->Run();

		delete pLib;
	}
}

在這裡插入圖片描述 在這裡插入圖片描述

要點總結

  • Template Method模式是一種非常基礎性的設計模式,在面向物件系統中有著大量的應用。它用最簡潔的機制(虛擬函式的多型性) 為很多應用程式框架提供了靈活的擴充套件點,是程式碼複用方面的基本實現結構。
  • 除了可以靈活應對子步驟的變化外, “不要呼叫我,讓我來呼叫你” 的反向控制結構是Template Method的典型應用。
  • 在具體實現方面,被Template Method呼叫的虛方法可以具有實現,也可以沒有任何實現(抽象方法、純虛方法),但一般推薦將它們設定為protected方法。