- 処理の呼び出し手順(流れ)の再利用
- デフォルト動作を定義したときに、サブクラスで定義し忘れないよう注意
- メリット
- 処理の流れを把握しやすい
- カスタマイズポイントが明確
- 処理の流れの再利用ができ、コード量を減らせる
#include <iostream>
using namespace std;
// The 'AbstractClass' abstract class
class AbstractClass {
public:
// The "Template method"
void TemplateMethod() {
PrimitiveOperation1();
PrimitiveOperation2();
PrimitiveOperation3();
cout << endl;
}
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
// hook method
virtual void PrimitiveOperation3() {
cout << "AbstractClass::PrimitiveOperation3()" << endl;
}
};
// A 'ConcreteClass' class
class ConcreteClassA : public AbstractClass {
public:
virtual void PrimitiveOperation1() {
cout << "ConcreteClassA::PrimitiveOperation1()" << endl;
}
virtual void PrimitiveOperation2() {
cout << "ConcreteClassA::PrimitiveOperation2()" << endl;
}
};
// A 'ConcreteClass' class
class ConcreteClassB : public AbstractClass {
public:
virtual void PrimitiveOperation1() {
cout << "ConcreteClassB::PrimitiveOperation1()" << endl;
}
virtual void PrimitiveOperation2() {
cout << "ConcreteClassB::PrimitiveOperation2()" << endl;
}
virtual void PrimitiveOperation3() {
cout << "ConcreteClassB::PrimitiveOperation3()" << endl;
}
};
// client
int main() {
AbstractClass *aA, *aB;
aA = new ConcreteClassA();
aA->TemplateMethod();
aB = new ConcreteClassB();
aB->TemplateMethod();
delete aA;
delete aB;
return 0;
}
出力
ConcreteClassA::PrimitiveOperation1()
ConcreteClassA::PrimitiveOperation2()
AbstractClass::PrimitiveOperation3()
ConcreteClassB::PrimitiveOperation1()
ConcreteClassB::PrimitiveOperation2()
ConcreteClassB::PrimitiveOperation3()
参考サイト
最終更新:2012年03月02日 21:58