Template Method パターン

Template Method パターン - Wikipedia

AbstractDisplay(AbstractClass)で処理の骨組みを規定して、CharDisplay・StringClass(ConcreteClass)で処理の内容を具体化。

#include <iostream>
#include <string>
using namespace std;
//AbstractClass
class AbstractDisplay
{
public:
	virtual void Open() = 0;
	virtual void Print() = 0;
	virtual void Close() = 0;
	void Display(){
		Open();
		for(int i = 0; i < 5; i++){
			Print();
		}
		Close();
	}
};
//ConcreteClass
class CharDisplay : public AbstractDisplay
{
public:
	CharDisplay(char ch){
		ch_ = ch;
	}
	void Open(){
		cout << "<<";
	}
	void Print(){
		cout << ch_;
	}
	void Close(){
		cout << ">>" << endl;
	}
private :
	char ch_;
};
class StringDisplay : public AbstractDisplay
{
public:
	StringDisplay(string str){
		string_ = str;
	}
	void Open(){
		PrintLine();
	}
	void Print(){
		cout << "|" << string_ << "|" << endl;
	}
	void Close(){
		PrintLine();
	}
private :
	string string_;
	void PrintLine(){
		cout << "+";
		for(unsigned int i = 0; i < string_.length(); i++){
			cout << "-";
		}
		cout << "+" << endl;
	}
};

//main
int main()
{
	AbstractDisplay * abstract_display  = new CharDisplay('H');
	AbstractDisplay * abstract_display2 = new StringDisplay("Hello, world!");
	abstract_display->Display();
	abstract_display2->Display();
	
	delete abstract_display;
	delete abstract_display2;

	getchar();
	return 0;
}