전략 패턴이란?
- 행동(알고리즘)을 객체로 캡슐화하여, 동적으로 알고리즘을 변경할 수 있도록 하는 디자인 패턴
- 즉, 실행 중에 알고리즘 변경 시 if-else/switch 문 없이 변경 가능
- 실행 중에 전략(알고리즘) 변경 가능
- 코드 중복 줄이고, 결합도 낮출 수 있음
구성 요소
1. Strategy (전략 인터페이스)
특정 행동(알고리즘)의 인터페이스를 정의
2. Concrete Strategy (구체적인 전략)
Strategy 인터페이스를 구현하여 각각의 알고리즘을 정의
3. Context (문맥 클래스)
실행할 알고리즘(Strategy)을 내부에서 참조하며, 동적으로 전략 변경 가능
패턴 흐름
1. Context는 Strategy 인터페이스를 통해 알고리즘을 실행
2. Concrete Strategy가 구체적인 알고리즘을 구현
3. Context에서 실행 중에 다른 Concrete Strategy로 변경 가능
4. if-else 없이 동적으로 알고리즘 변경 가능
전략 패턴 예제 (C++)
1. #include <iostream>
2. #include <memory>
3.
4. using namespace std;
5.
6. // 1. 전략 인터페이스
7. class MoveStrategy {
8. public:
9. virtual void move() = 0;
10. virtual ~MoveStrategy() {}
11. };
12.
13. // 2. 구체적인 전략 (걷기)
14. class WalkStrategy : public MoveStrategy {
15. public:
16. void move() override {
17. cout << "로봇이 천천히 걷습니다." << endl;
18. }
19. };
20.
21. // 3. 구체적인 전략 (달리기)
22. class RunStrategy : public MoveStrategy {
23. public:
24. void move() override {
25. cout << "로봇이 빠르게 달립니다!" << endl;
26. }
27. };
28.
29. // 4. 구체적인 전략 (점프하기)
30. class JumpStrategy : public MoveStrategy {
31. public:
32. void move() override {
33. cout << "로봇이 높이 점프합니다!" << endl;
34. }
35. };
36.
37. // 5. Context (로봇 클래스)
38. class Robot {
39. private:
40. unique_ptr<MoveStrategy> strategy; // 전략 패턴 적용
41.
42. public:
43. void setStrategy(MoveStrategy* newStrategy) {
44. strategy.reset(newStrategy);
45. }
46.
47. void move() {
48. if (strategy)
49. strategy->move();
50. else
51. cout << "이동 전략이 설정되지 않았습니다!" << endl;
52. }
53. };
54.
55. // 6. 클라이언트 코드
56. int main() {
57. Robot robot;
58.
59. robot.setStrategy(new WalkStrategy());
60. robot.move(); // 로봇이 천천히 걷습니다.
61.
62. robot.setStrategy(new RunStrategy());
63. robot.move(); // 로봇이 빠르게 달립니다!
64.
65. robot.setStrategy(new JumpStrategy());
66. robot.move(); // 로봇이 높이 점프합니다!
67.
68. return 0;
69. }
70.
전략 패턴 장점
1. 실행 중에 전략을 바꿀 수 있어, 유연한 설계가 가능
2. 각 전략을 별도 클래스로 분리하므로, 코드가 명확하고 변경이 쉬움
3. 새로운 전략을 추가해도 기존 코드 변경 필요 X
전략 패턴 단점
1. 별도의 클래스로 정의하므로 클래스 수가 많아질 수 있음
2. 단순한 경우라면 그냥 if-else 문으로 처리하는게 더 쉬울 수 있음
'Unity > 디자인 패턴' 카테고리의 다른 글
| 디자인 패턴 (행위 패턴) - 책임 연쇄 패턴(Chain of Responsibility Pattern) (0) | 2025.08.30 |
|---|---|
| 디자인 패턴 (행위 패턴) - 템플릿 메서드 패턴 (Template Method Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (행위 패턴) - 상태 패턴 (State Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (행위 패턴) - 옵저버 패턴 (Observer Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (행위 패턴) - 이터레이터 패턴 (Iterator Pattern) (0) | 2025.08.30 |