設計モード:10テンプレートメソッドモード


テンプレートメソッドモード:
問題:
継承を使用して、サブクラスのテンプレートになるべきで、すべての重複コードは親クラスに上昇し、各サブクラスを重複させるのではありません.
解決方法:
ある詳細階層で一致するプロセスを完了する必要がありますが、個別のステップのより詳細な階層での実装は異なる場合があります.テンプレートメソッドモードで処理します.
意味:操作中のアルゴリズムのスケルトンを定義し、ステップをサブクラスに遅延します.テンプレートメソッドにより、サブクラスは、アルゴリズム構造を変更することなく、アルゴリズムの特定のステップを再定義することができる.
 
テンプレートメソッドモード:不変の動作をスーパークラスに移動し、サブクラスの重複コードを除去します.テンプレートメソッドモードは、コード多重化を提供します.
 
main.cpp
#include <iostream>
#include <stdlib.h>
#include "Beverage.h"
#include "Coffee.h"
#include "Tea.h"

using namespace std;

void process()
{
	cout << "    :" << endl;
	Coffee coffee;
	coffee.prepareRecipe();
	cout << "
:" << endl; Tea tea; tea.prepareRecipe(); } int main(int argc,char* argv[]) { process(); system("pause"); return 0; }

Tea.h
#ifndef TEA_H
#define TEA_H
#include "beverage.h"
class Tea :
	public Beverage
{
public:
	Tea(void);
	~Tea(void);
protected:
	void brew();
	void addCondiments();
};
#endif


Tea.cpp
#include "Tea.h"
#include <iostream>

using namespace std;

Tea::Tea(void)
{
}


Tea::~Tea(void)
{
}

void Tea::brew()
{
	cout << "       " << endl;
}

void Tea::addCondiments()
{
	cout << "   " << endl;
}

Coffee.h
#ifndef COFFEE_H
#define COFFEE_H
#include "beverage.h"
class Coffee :
	public Beverage
{
public:
	Coffee(void);
	~Coffee(void);
protected:
	void brew();
	void addCondiments();
};
#endif


Coffee.cpp
#include "Coffee.h"
#include <iostream>

using namespace std;


Coffee::Coffee(void)
{
}


Coffee::~Coffee(void)
{
}

void Coffee::brew()
{
	cout << "       " << endl;
}

void Coffee::addCondiments()
{
	cout << "     " << endl;
}

Beverage.h
#ifndef BEVERAGE_H
#define BEVERAGE_H
class Beverage
{
public:
	Beverage(void);
	virtual ~Beverage(void);
	//        
	void prepareRecipe();
protected:
	void boilWater();//    
	virtual void brew();//  ,             
	void poulInCup();//          
	virtual void addCondiments();//   
};
#endif


Beverage.cpp
#include "Beverage.h"
#include <iostream>

using namespace std;

Beverage::Beverage(void)
{
}


Beverage::~Beverage(void)
{
}

//  :                ,           ;             ,     
void Beverage::prepareRecipe()
{
	boilWater();
	brew();
	poulInCup();
	addCondiments();
}

void Beverage::boilWater()//    
{
	cout << "    " << endl;
}

void Beverage::brew()//  ,             
{
}

void Beverage::poulInCup()//          
{
	cout << "    " << endl;
}

void Beverage::addCondiments()//   
{
}