-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
strategy.cpp
201 lines (170 loc) · 3.8 KB
/
strategy.cpp
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#include <iostream>
#include <ctime>
using namespace std;
// интерфейсы, которые описывают абстрактное поведение
__interface FlyBehavior
{
void Fly();
};
__interface QuackBehavior
{
void Quack();
};
///////////////////////////////////////////////////////////////////
// классы, которые реализуют типы полёта
class FlyWithWings : public FlyBehavior
{
public:
void Fly()
{
cout << "машет крыльями!\n";
}
};
class Flightless : public FlyBehavior
{
public:
void Fly()
{
cout << "я не умею летать :(\n";
}
};
class JetPack : public FlyBehavior
{
public:
void Fly()
{
cout << "использует реактивный ранец\n";
}
};
///////////////////////////////////////////////////////////////////////
// классы, которые реализуют типы кряканья
class UsualQuack : public QuackBehavior
{
public:
void Quack()
{
cout << "кря-кря!\n";
}
};
class Squeak : public QuackBehavior
{
public:
void Quack()
{
cout << "пиип-пиип!\n";
}
};
class SilentSqueak : public QuackBehavior
{
public:
void Quack()
{
cout << "* тишина *\n";
// или вообще, тело метода можно оставить пустым
}
};
////////////////////////////////////////////////////////////////
// базовый абстрактный класс уток
class Duck abstract
{
protected:
FlyBehavior* fly_behavior = nullptr;
QuackBehavior* quack_behavior = nullptr;
public:
void virtual Swim() // может быть переопределён
{
cout << "все утки плавают!\n";
}
void virtual Display() = 0; // должен быть переопределён!
//////////////////////////////////////////////////////////////////////
void PerformFly()
{
fly_behavior->Fly(); // делегирование поведения
}
void PerformQuack()
{
quack_behavior->Quack();
}
//////////////////////////////////////////////////////////////////////
void SetFlyBehavior(FlyBehavior* new_fly_behavior)
{
if (fly_behavior != nullptr) delete fly_behavior;
fly_behavior = new_fly_behavior;
}
void SetQuackBehavior(QuackBehavior* new_quack_behavior)
{
if (quack_behavior != nullptr) delete quack_behavior;
quack_behavior = new_quack_behavior;
}
};
////////////////////////////////////////////////////////////////
// конкретные утки
class MallardDuck : public Duck
{
public:
MallardDuck()
{
fly_behavior = new FlyWithWings;
quack_behavior = new UsualQuack;
}
void Display()
{
system("start https://trancemusic.000webhostapp.com/cpp/mallard.jpg");
}
};
class RubberDuck : public Duck
{
public:
RubberDuck()
{
fly_behavior = new Flightless;
quack_behavior = new Squeak;
}
void virtual Display()
{
system("start https://trancemusic.000webhostapp.com/cpp/rubber.jpg");
}
};
class DecoyDuck : public Duck // деревянная утка-манок
{
public:
DecoyDuck()
{
fly_behavior = new Flightless;
quack_behavior = new SilentSqueak;
}
void virtual Display()
{
system("start https://trancemusic.000webhostapp.com/cpp/decoy.jpg");
}
};
int main()
{
setlocale(0, "");
system("title Решение # 2");
Duck* duck = new MallardDuck;
duck->PerformFly();
duck->PerformQuack();
duck->Swim();
// duck->Display();
// delete duck;
cout << endl;
/////////////////////////////////////////////
duck = new RubberDuck;
duck->PerformFly();
duck->PerformQuack();
// duck->Swim();
// delete duck;
cout << endl;
/////////////////////////////////////////////
duck = new DecoyDuck;
duck->PerformFly();
duck->PerformQuack();
// duck->Swim();
cout << endl;
duck->SetFlyBehavior(new JetPack);
duck->SetQuackBehavior(new Squeak);
duck->PerformFly();
duck->PerformQuack();
// delete duck;
}