디자인패턴

템플릿 메소드 패턴

khkg12 2023. 8. 4. 15:49

템플릿 메소드 패턴

템플릿 메소드에 virtual 함수들이 들어가고 그 가상함수만 자식 클래스에서 재정의 해주는 패턴이다.

즉 차이가 있는 것만 vritual로 빼주고 공통되는 부분은 그대로 냅두는 것이다.

 

ex) player와 monster라는 클래스가 character를 상속받을 때 둘의 죽음에 대한 기능(Die메소드)를 템플릿 메소드 패턴을 이용해 서로 다르게 쓰여야할 기능만 virtual로 빼서 정의한다.

 

코드예시)

class Character
{
	protected: // 자식한테만 참조가능하게 
	int hp = 100;
	int atk;
	virtual void PostProcessDIe() = 0; // 노출이 되면안됨
	public:
	string name;
	void SetHp(int value)
	{
		hp = value;
		if (hp <= 0)
		{
			Die();
		}
	}
	const int& GetHp() const
	{
		return hp;
	}

	virtual void PrintImage() = 0;

	void Die()
	{
		PrintImage();
		cout << name << "이 죽었습니다" << endl;
		PostProcessDIe();
	}
};

class Player : public Character
{
	int state = 0;
public:
	void PrintImage() override
	{
		switch (state)
		{
		case 0: // 멀쩡한 상태
			cout << "멀쩡" << endl;
			break;
		case 1: // 분노 상태
			cout << "분노" << endl;
			break;
		case 2: // 지친 상태
			cout << "지침" << endl;
			break;
		}
	}

	void PostProcessDIe() override
	{
		cout << "경험치 감소" << endl;
		cout << "hp를 1로변경" << endl;
		cout << "마을씬으로 돌아감" << endl;
	}
};

class Monster : public Character
{
	public:
	void PrintImage() override
	{
		cout << "몬스터그림" << endl;
	}
	void PostProcessDIe() override
	{
		cout << "아이템 드랍" << endl;
	}
};