개발하는 리프터 꽃게맨입니다.
[C++/디자인패턴] 상태 패턴 (State Pattern) 본문
상태 패턴
1) 개요
스테이트 패턴은 객체가 특정 상태에 따라 다른 기능을 구현할 때,
객체가 자기 상태에 따라 행위를 호출하는 것이 아니라,
상태를 객체화하여 상태가 행동을 할 수 있도록하는 패턴을 말합니다.
2) 기본 구조
예를들어 게임 캐릭터가 있다고 상상해봅시다.
게임캐릭터는 대기, 점프, 달리기, 웅크리기 총 4개의 상태를 가지고 있다고 하고
각각 상태에 따라 공격을 구현해봅시다.
그런데 이 코드에는 단점이 있습니다.
만약 캐릭터가 공격뿐만 아니라
공격, 방어, 스킬 총 3개의 동작이 존재한다고 하면
case처리만 12개로 늘어나 버립니다.
여기서 상태도 늘어나버린다면, 코드가 더욱 복잡해지겠죠?
그래서 이 때 사용하는 것이 스테이트 패턴입니다.
3) 예시
이런 식으로 상태를 객체화해서 상태가 행동을 할 수 있도록 역할을 위임합니다.
이런 식으로 구성하면 코어 플레이어 클래스는 CallAttack 이란 함수를 호출하여
간단하게 상태에 따라 다른 공격 함수 호출할 수 있게 됩니다.
4) 기타
상태 변화가 적은 경우에는 그냥 Switch 문으로 처리하는게 오히려 더 좋을 수 있습니다.
5) 장단점
장점
(1) 단일 책임의 원칙에 부합한다.
하나의 클래스는 하나의 책임을 가질수록 OOP 지향적인 프로그래밍입니다.
위 코드를 보면 상태에 따라 코드의 분기를 Player단에서 하지 않고,
한 상태가 자신에 대한 처리만 할 수 있도록 구분해두고 있습니다.
이럴 경우 각 상태 로직에 대한 수정이 용의하고 가독성이 높아지죠.
(2) 개방-폐쇄의 원칙에 부합한다.
상태를 확장하기 위해서는 새로운 추가 상태 클래스를 만들기만하면 됩니다.
확장에 용이하고 굳이 Player 코드는 건들일필요가 없습니다.
(3) 유지 보수, 테스트 디버깅에 있어서 유리하다.
'기타 개발 지식 > 디자인패턴' 카테고리의 다른 글
[C++/디자인패턴] 커맨드 패턴 (Command Pattern) (1) | 2024.01.29 |
---|---|
[C++/디자인패턴] 옵저버 패턴 (Observer) (1) | 2024.01.29 |
[C++/디자인패턴] 싱글톤 (Singletone) (1) | 2024.01.27 |
[C++/디자인패턴] 팩토리 메소드 패턴 (2) | 2024.01.27 |
[C++/디자인패턴] 디자인 패턴 및 소프트웨어 개발 원칙 (1) | 2024.01.27 |