State 패턴

·2022년 9월 4일

c++ 디자인 패턴

목록 보기
6/9
  • 출처 : 녹두로님

  • 슈퍼 마리오 게임이 있음!
    획득하는 아이템의 종류에 따라 달리기와 공격이 달라진다고 하면 이러한 코드를 작성할 수 있음.

#include <iostream>

using namespace std;

class character
{
public : 
	int item;
public : 

	character() : item(1)
	{}

	void SetItem(int _item)
	{
		item = _item;
	}

	void run()
	{
		switch (item)
		{
		case 1 : 
			cout << "run" << endl;
			break; 

		case 2 : 
			cout << "fast run" << endl;
			break;
		}
	}

	void attack()
	{
		switch (item)
		{
		case 1:
			cout << "attack" << endl;
			break;

		case 2:
			cout << "power attack" << endl;
			break;
		}
	}
};

int main(void)
{
	character* mario = new character;
	mario->attack();
	mario->run();

	mario->SetItem(2);
	mario->attack();
	mario->run();

}
  • 이 코드의 문제점
    : 아이템이 새롭게 만들어 질 때마다 또 작성해야 한다는 번거로움이..
    run과 attack 둘다에서 추가해야 함.

가상 함수에 의한 변환

  • 상속을 통한 변환은 객체를 변경시키는 것이 아니라, 클래스에 의한 변경임.
    즉 새로운 클래스를 만드는 것일 뿐.

problem

  • character 클래스를 이용해 normal character, power character
    클래스를 만들어서 .
    업캐스팅해서 run, attack 동작을 수행하라.
  • 결과

    : 객체 자체가 변경되는 것이 아닌, 새로운 객체가 생성되고,
    그것을 참조하고 있는 것임.
    이렇게 되면 메모리를 해제하고 다시, 새로운 객체를 참조 하는 것이 나을 듯.

변하는 것들만 클래스로 분리하자.

problem

  • 상태를 나타내는 인터페이스 클래스를 만들고, 이를 이용해
    run, attack을 새롭게 정의하는 클래스를 만들어라.

  • 결과

    상태로 사용된, 지역 객체 p와 s에 대한 메모리 해제에 대한
    걱정을 할 필요가 없음.


-> 객체에 의한 변화 이다.

  • 이를 상태 패턴이라고 하는데, 이전에 배운 전략 패턴과 동일한 듯한데...

전략 패턴 vs 상태 패턴

: 클래스 다이어 그램은 동일함.

profile
🔥🔥🔥

0개의 댓글