728x90
1. 하위 클래스 샌드박스 패턴 정의
- 상위 클래스가 제공하는 기능들을 통해서 하위 클래스에서 행동을 정의하는 패턴
- 제공 기능은 protected로 만들어져 하위 클래스용이라는 걸 분명히 하여 사용한다.
2. 상위 클래스 구현
class Superpower
{
public:
virtual ~Superpower() {}
protected:
virtual void Activate() = 0;
void Move( double InX, double InY, double InZ )
{
//..
}
void PlaySound( SoundId InSoundId, double InVolume )
{
//..
}
};
- Activate() 는 샌드박스 메서드다. 순수 가상 함수로 만들었기 때문에 하위 클래스가 반드시 오버라이드해야 한다.
- Move(), PlaySound() 함수는 제공 기능이며, 하위 클래스에서 Activate() 메서드를 구현할 때 호출한다.
3. 하위 클래스 구현
class SkyLaunch : public Superpower
{
protected:
// 순수 가상함수 오버라이드
virtual void Activate() override
{
// 상위 클래스에 정의된 제공 기능
PlaySound( SOUND_SPROING, 1.f );
//...
//...
//...
// 상위 클래스에서 정의된 제공 기능
Move( 0, 0, 0 );
}
};
- Activate() 는 샌드박스 메서드이므로 사용처에 맞게 자유롭게 구현할 수 있다.
4. 객체를 통해 메서드 제공
class FSoundPlayer
{
public:
void PlayerSound( SoundId InSoundId, double InVolume ) {}
void StopSound( SoundId InSoundId ) {}
void SetVolume( SoundId, double InVolume ) {}
};
class Superpower
{
private:
FSoundPlayer SoundPlayer;
public:
virtual ~Superpower() {}
protected:
virtual void Activate() = 0;
// 제공 기능을 별도 객체를 통해 제공
FSoundPlayer& GetSoundPlayer() { return SoundPlayer; }
void Move( double InX, double InY, double InZ )
{
//..
}
};
class SkyLaunch : public Superpower
{
protected:
// 순수 가상함수 오버라이드
virtual void Activate() override
{
// 상위 클래스에 정의된 제공 기능
GetSoundPlayer().PlayerSound( SOUND_SPROING, 1.f );
//...
//...
//...
// 상위 클래스에서 정의된 제공 기능
Move( 0, 0, 0 );
}
};
- 제공 기능 일부를 별도 객체를 통해 제공한다.
- 상위 클래스의 메서드 개수를 줄일 수 있는 장점이 있다.
- SuperPower 클래스 사운드 관련된 모든 의존을 SoundPlayer 클래스 하나에 캡슐화할 수 있어 커플링을 낮출 수 있다.
반응형
'Design Pattern > 게임 프로그래밍 패턴' 카테고리의 다른 글
[Design Pattern] 이벤트 큐 패턴 (0) | 2022.08.05 |
---|---|
[Design Pattern] 컴포넌트 패턴 (0) | 2022.08.05 |
[Design Pattern] 바이트 코드 패턴 (0) | 2022.08.02 |
[Design Pattern] 업데이트 메서드 패턴 (0) | 2022.08.01 |
[Design Pattern] 게임 루프 패턴 (0) | 2022.07.31 |