디자인 패턴 - II

그림자왕국·2022년 1월 13일
1

Design Patterns

목록 보기
2/5

명령 패턴

명령 패턴(Command Pattern)은 메서드 호출을 실체화한 것이다.

실체화라는 뜻은 어떠한 것을 변수에 저장하거나 함수에 전달할 수 있도록 데이터로 만든다는 것.

즉, 메서드를 객체로 바꿀 수 있다는 것을 뜻한다.

class Command{
public:
	virtual ~Command(){}
        virtual void execute(GameActor& actor) = 0;
};

class JumpCommand : public Command{
public :
	virtual void execute(GameActor& actor){
    	actor.jump(); // actor을 전달받아 호출한다.
    }
};
Command* command = inputHandler.handleInput(); // 키 입력 반환
if(command){
	command->execute(actor); // 객체화된 메서드를 호출한다. (명령)
}

경랑 패턴

경량 패턴은 클래스의 공유할 수 있는 특정 멤버를 모든 인스턴스가 공유할 수 있게 하여 효율적으로 메모리를 절약하는 디자인 패턴이다.

class Terrain 
{
    public:
    Terrain(Cost,isWater,texture) {...}

    private:
    int Cost;
    bool isWater;
    Texture texture;
}

class World
{

public:
  World() :
  grassTerrain(1,false,GRASS_TEXTURE),
  hillTerrain(3,false,HILL_TEXTURE),
  riverTerrain(2,treu,RIVER_TEXTURE) {} // terrain 세팅 인스턴스 초기화

private:
    Terrain grassTerrain;
    Terrain hillTerrain;
    Terrain riverTerrain;
}

generateTerrain()
{
  Terrain * tiles;
  tiles[x][y] = &grassTerrain, &hillTerrain, &riverTerrain...;
  // 지형이 될 타일에 경량 패턴으로 선언한 Terrain 인스턴스를 참조한다.
}

지형이 될 타일을 경량 패턴으로 구현한 Terrain 인스턴스를 참조하게 하면 각 title 인스턴스마다 멤버를 새로 메모리에 할당해주지 않아도 되며, 공용으로 선언한 xxxTerrain 인스턴스의 멤버를 참조하기만 하면 되니 이를 경량 패턴이라고 한다.


관찰자 패턴

관찰자 패턴(Observer Pattern)은 MVC 구조를 쓰는 프로그램이 주로 사용하는 패턴이다.

관찰자 패턴의 구조는 관찰자(observer), 대상(subject)으로 나뉘는데 관찰자 클래스는 노티파이(알림)가 일어날 때 호출되는 바인딩할 함수를 정의하고 노티파이를 호출하는 곳에는 subject 인스턴스를 생성하여 노티파이를 호출하는 개념이다.

노티파이를 호출하면 observer 클래스를 상속 받은 클래스에서 등록된 함수를 실행한다.

class Achievements : public Observer
{
    virtual void OnNotify(Entity& entity, Event event) { switch(event) {...} } 
    // 업적 기능을 구현하기위해 관찰자 클래스를 상속 받아 노티파이 함수를 오버라이드했다.
    // entity는 알림이 일어나는 곳, event는 노티파이의 종류이다.
}

class Subject
{
protectd:
 void notify(Entity& entity, Event event) { ovserver[i]->onNotify(entity,event); } // 특정 타이밍에 관찰자를 호출하는 메서드

private:
 Observer* observers[MAX_OBSERVERS]; // 관찰자 인스턴스를 선언
}


class Physics : public Subject
{
 public:
  void OnUpdate(Entity& entity) { if(...) { notify(entity,event); } } // 물리 엔진(Physics)에서 특정한 일이 생기면, notify()를 호출해 관찰자(Observer)에게 알림(Notify)를 전달하여 일을 처리한다.
}

이렇게 서로 엉켜질 일이 없는 전혀 상관없는 객체끼리 정보를 주고받아야 하는 상황이 있을 때
(물리엔진과 업적기능의 통신처럼) 관찰자 패턴을 사용한다.

profile
언리얼 엔진 매니아입니다.

0개의 댓글