Template Method

  • 処理の呼び出し手順(流れ)の再利用
  • デフォルト動作を定義したときに、サブクラスで定義し忘れないよう注意
  • メリット
    • 処理の流れを把握しやすい
    • カスタマイズポイントが明確
    • 処理の流れの再利用ができ、コード量を減らせる

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // The 'AbstractClass' abstract class
  5. class AbstractClass {
  6. public:
  7. // The "Template method"
  8. void TemplateMethod() {
  9. PrimitiveOperation1();
  10. PrimitiveOperation2();
  11. PrimitiveOperation3();
  12. cout << endl;
  13. }
  14. virtual void PrimitiveOperation1() = 0;
  15. virtual void PrimitiveOperation2() = 0;
  16. // hook method
  17. virtual void PrimitiveOperation3() {
  18. cout << "AbstractClass::PrimitiveOperation3()" << endl;
  19. }
  20. };
  21.  
  22. // A 'ConcreteClass' class
  23. class ConcreteClassA : public AbstractClass {
  24. public:
  25. virtual void PrimitiveOperation1() {
  26. cout << "ConcreteClassA::PrimitiveOperation1()" << endl;
  27. }
  28. virtual void PrimitiveOperation2() {
  29. cout << "ConcreteClassA::PrimitiveOperation2()" << endl;
  30. }
  31. };
  32.  
  33. // A 'ConcreteClass' class
  34. class ConcreteClassB : public AbstractClass {
  35. public:
  36. virtual void PrimitiveOperation1() {
  37. cout << "ConcreteClassB::PrimitiveOperation1()" << endl;
  38. }
  39. virtual void PrimitiveOperation2() {
  40. cout << "ConcreteClassB::PrimitiveOperation2()" << endl;
  41. }
  42. virtual void PrimitiveOperation3() {
  43. cout << "ConcreteClassB::PrimitiveOperation3()" << endl;
  44. }
  45. };
  46.  
  47. // client
  48. int main() {
  49. AbstractClass *aA, *aB;
  50. aA = new ConcreteClassA();
  51. aA->TemplateMethod();
  52. aB = new ConcreteClassB();
  53. aB->TemplateMethod();
  54.  
  55. delete aA;
  56. delete aB;
  57. return 0;
  58. }
  59.  

出力
ConcreteClassA::PrimitiveOperation1()
ConcreteClassA::PrimitiveOperation2()
AbstractClass::PrimitiveOperation3()

ConcreteClassB::PrimitiveOperation1()
ConcreteClassB::PrimitiveOperation2()
ConcreteClassB::PrimitiveOperation3()




参考サイト

デザインパターンを“喩え話”で分かり易く理解する
http://www.netlaputa.ne.jp/~hijk/study/oo/designpattern.html



デザインパターンの骸骨たち
http://www002.upp.so-net.ne.jp/ys_oota/mdp/

デザインパターンの使い方:Template Method
http://japan.internet.com/developer/20080909/26.html
最終更新:2012年03月02日 21:58