設計模式(22)-行為型模式-Template Method模式
功能
在面向物件系統的分析與設計過程中經常會遇到這樣一種情況:對於某一個業務邏輯(演算法實現)在不同的物件中有不同的細節實現,但是邏輯(演算法)的框架(或通用的應用演算法)是相同的。Template提供了這種情況的一個實現框架。
Template模式是採用繼承的方式實現這一點:將邏輯(演算法)框架放在抽象基類中,並定義好細節的介面,子類中實現細節。【註釋1】
【註釋1】:Strategy模式解決的是和Template模式類似的問題,但是Strategy模式是將邏輯(演算法)封裝到一個類中,並採取組合(委託)的方式解決這個問題。
3.10.2結構
• A b s t r a c t C l a s s(抽象類,如A p p l i c a t i o n)
— 定義抽象的 原語操作(primitive operation) ,具體的子類將重定義它們以實現一個演算法的各步驟。
— 實現一個模板方法,定義一個演算法的骨架。該模板方法不僅呼叫原語操作,也呼叫定義在Ab s t r a c t C l a s s或其他物件中的操作。
• C o n c r e t e C l a s s(具體類,如M y A p p l i c a t i on)
— 實現原語操作以完成演算法中與特定子類相關的步驟。
協作:
•ConcreteClass靠Ab s t r a c t C l a s s來實現演算法中不變的步驟。就是利用面向物件中多型的概念實現演算法實現細節和高層介面的鬆耦合。
模板方法導致一種反向的控制結構(IoC),這種結構有時被稱為“好萊塢法則” ,即“別找我們,我們找你”.
3.10.3 C++程式碼示例
//Template.h
#ifndef _TEMPLATE_H_
#define _TEMPLATE_H_
class AbstractClass
{
public:
virtual ~AbstractClass();
void TemplateMethod();
protected:
virtualvoidPrimitiveOperation1() = 0;
virtualvoidPrimitiveOperation2() = 0;
AbstractClass();
private:
};
class ConcreteClass1 :public AbstractClass
{
public:
ConcreteClass1();
~ConcreteClass1();
protected:
void PrimitiveOperation1();
void PrimitiveOperation2();
private:
};
class ConcreteClass2 :public AbstractClass
{
public:
ConcreteClass2();
~ConcreteClass2();
protected:
void PrimitiveOperation1();
void PrimitiveOperation2();
private:
};
#endif //~TEMPLATEH
//Template.cpp
#include"Template.h"
#include<iostream>
using namespace std;
AbstractClass::AbstractClass()
{
}
AbstractClass::~AbstractClass()
{
}
void AbstractClass::TemplateMethod()
{
this->PrimitiveOperation1();
this->PrimitiveOperation2();
}
ConcreteClass1::ConcreteClass1()
{
}
ConcreteClass1::~ConcreteClass1()
{
}
void ConcreteClass1::PrimitiveOperation1()
{
cout << "ConcreteClass1...PrimitiveOperat
ion1"<<endl;
}
void ConcreteClass1::PrimitiveOperation2()
{
cout << "ConcreteClass1...PrimitiveOperat
ion2"<<endl;
}
ConcreteClass2::ConcreteClass2()
{
}
ConcreteClass2::~ConcreteClass2()
{
}
void ConcreteClass2::PrimitiveOperation1()
{
cout << "ConcreteClass2...PrimitiveOperat
ion1"<<endl;
}
void ConcreteClass2::PrimitiveOperation2()
{
cout << "ConcreteClass2...PrimitiveOperat
ion2"<<endl;
}
//main.cpp
#include"Template.h"
#include<iostream>
using namespace std;
int main(int argc, char*argv[])
{
AbstractClass* p1 = new ConcreteClass1();
AbstractClass* p2 = new ConcreteClass2();
p1->TemplateMethod();
p2->TemplateMethod();
return 0;
}