반응형
스트래티지 패턴(Strategy Pattern)은 알고리즘을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만드는 패턴입니다.
이 패턴을 활용하면, 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있습니다.
이 패턴을 익히면서 알 수 있는 객체 지향적 원칙이 있습니다.
- 바뀌는 부분은 캡슐화 한다.
- 상속보다는 구성을 활용한다.
- 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다.
기본적으로는 Animal 클래스로부터 상속을 받는 형식으로 구성되어있습니다.
달리고, 날고, 뛰는 등의 행위가 객체마다 다르다고 가정하여 분리를 하였습니다.
아래에 코드가 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
#include <iostream>
using namespace std;
class RunBehavior // 뛰는 행동에 대한 기본 클래스
{
public :
virtual void run() {};
};
class YesRun : public RunBehavior // 뛰는 행동에 대한 클래스를 상속 받은 달릴수 있다는 클래스
{
public :
void run() { cout << "전 달릴수 있어요!" << endl; };
};
class NoRun : public RunBehavior // 뛰는 행동에 대한 클래스를 상속 받은 달릴수 없다는 클래스
{
public:
void run() {cout << "전 뛰지 못해요!" <<endl;};
};
class FlyBehavior // 달리는 행동에 대한 기본 클래스
{
public :
virtual void fly() {};
};
class YesFly : public FlyBehavior // 달리는 행동에 대한 클래스를 상속 받은 날수 있음을 알리는 클래스
{
public :
void fly() { cout << "전 날수 있어요!" << endl; };
};
class NoFly : public FlyBehavior // 달리는 행동에 대한 클래스를 상속 받은 날수 없음을 알리는 클래스
{
public:
void fly() { cout << "전 날지못해요!" << endl; };
};
class BarkBehavior // 짖는 행동에 대한 기본 클래스
{
public :
virtual void bark() {};
};
class YesBark : public BarkBehavior // 짖는 행동에 대한 클래스를 상속 받은 짖을수 있음을 알리는 클래스
{
public :
void bark() { cout << "왈왈!!!" << endl; };
};
class NoBark : public BarkBehavior // 짖는 행동에 대한 클래스를 상속 받은 짖을수 없음을 알리는 클래스
{
public:
void bark() { cout << "읍읍!!! 전 짖을수 없어요!" << endl; };
};
class Animal // 상속의 바탕이 될 기본 클래스
{
RunBehavior *runBehavior;
FlyBehavior *flyBehavior;
BarkBehavior *barkBehavior;
void performRun() { runBehavior->run(); }; // 다른곳에서 접근을 방지하기 위해 private 부분에 선언
void performFly() { flyBehavior->fly(); };
void performBark() { barkBehavior->bark(); };
public:
virtual void display(); // 상속 받은 곳에서 출력을 시키기 위한 함수 상속받는 곳에서 재정의
void setRunBehavior(RunBehavior *rb);
void setFlyBehavior(FlyBehavior *fb);
void setBarkBehavior(BarkBehavior *bb);
};
void Animal::setRunBehavior(RunBehavior *rb)
{
runBehavior = rb;
}
void Animal::setFlyBehavior(FlyBehavior *fb)
{
flyBehavior = fb;
}
void Animal::setBarkBehavior(BarkBehavior *bb)
{
barkBehavior = bb;
}
void Animal::display()
{
performRun();
performFly();
performBark();
cout << endl;
}
class Human : public Animal
{
public :
void display();
};
void Human::display()
{
cout << "전 사람입니다." << endl;
Animal::display();
}
class Dog : public Animal
{
public:
void display();
};
void Dog::display()
{
cout << "전 강아지입니다." << endl;
Animal::display();
}
class Eagle : public Animal
{
public:
void display();
};
void Eagle::display()
{
cout << "전 독수리입니다." << endl;
Animal::display();
}
int main()
{
YesRun yr;
NoRun nr;
YesFly yf;
NoFly nf;
YesBark yb;
NoBark nb;
Human human;
human.setRunBehavior(&yr);
human.setFlyBehavior(&nf);
human.setBarkBehavior(&nb);
human.display();
Dog dog;
dog.setRunBehavior(&yr);
dog.setFlyBehavior(&nf);
dog.setBarkBehavior(&yb);
dog.display();
Eagle eagle;
eagle.setRunBehavior(&nr);
eagle.setFlyBehavior(&yf);
eagle.setBarkBehavior(&nb);
eagle.display();
return 0;
}
Colored by Color Scripter
|
수정할 부분이나 틀린 부분이 있을 시 댓글로 알려주시면 감사하겠습니다!
반응형