-
Notifications
You must be signed in to change notification settings - Fork 0
/
Adapter.cpp
119 lines (106 loc) · 3.3 KB
/
Adapter.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
//Adapter pattern
#include <iostream>
#include <algorithm>
/**
* Целевой класс объявляет интерфейс, с которым может работать клиентский код.
*/
class Target
{
public:
virtual ~Target() = default;
virtual std::string Request() const
{
return "Target: The default target's behavior.";
}
};
/**
* Адаптируемый класс содержит некоторое полезное поведение, но его интерфейс
* несовместим с существующим клиентским кодом. Адаптируемый класс нуждается в
* некоторой доработке, прежде чем клиентский код сможет его использовать.
*/
class Adaptee
{
public:
std::string SpecificRequest() const
{
return ".eetpadA eht fo roivaheb laicepS";
}
};
/**
* Адаптер делает интерфейс Адаптируемого класса совместимым с целевым
* интерфейсом с помощью множественного наследования.
*/
class Adapter : public Target, public Adaptee
{
public:
Adapter() {}
std::string Request() const override
{
std::string to_reverse = SpecificRequest();
std::reverse(to_reverse.begin(), to_reverse.end());
return "Adapter: (TRANSLATED) " + to_reverse;
}
};
/**
* Клиентский код поддерживает все классы, использующие целевой интерфейс.
*/
void ClientCode(const Target *target)
{
std::cout << target->Request();
}
class Adapter2 : public Target
{
private:
Adaptee *adaptee_;
public:
Adapter2(Adaptee *adaptee) : adaptee_(adaptee) {}
std::string Request() const override
{
std::string to_reverse = this->adaptee_->SpecificRequest();
std::reverse(to_reverse.begin(), to_reverse.end());
return "Adapter: (TRANSLATED) " + to_reverse;
}
};
void test()
{
std::cout << "Client: I can work just fine with the Target objects:\n";
Target *target = new Target;
ClientCode(target);
std::cout << "\n\n";
Adaptee *adaptee = new Adaptee;
std::cout << "Client: The Adaptee class has a weird interface. See, I don't understand it:\n";
std::cout << "Adaptee: " << adaptee->SpecificRequest();
std::cout << "\n\n";
std::cout << "Client: But I can work with it via the Adapter:\n";
Adapter *adapter = new Adapter;
ClientCode(adapter);
std::cout << "\n";
delete target;
delete adaptee;
delete adapter;
}
void test2()
{
std::cout << "Client: I can work just fine with the Target objects:\n";
Target *target = new Target;
ClientCode(target);
std::cout << "\n\n";
Adaptee *adaptee = new Adaptee;
std::cout << "Client: The Adaptee class has a weird interface. See, I don't understand it:\n";
std::cout << "Adaptee: " << adaptee->SpecificRequest();
std::cout << "\n\n";
std::cout << "Client: But I can work with it via the Adapter:\n";
Adapter2 *adapter = new Adapter2(adaptee);
ClientCode(adapter);
std::cout << "\n";
delete target;
delete adaptee;
delete adapter;
}
int main()
{
test();
std::cout << "\n\n\n";
test2();
return 0;
}