-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathgeneric.cpp
More file actions
113 lines (89 loc) · 2.21 KB
/
generic.cpp
File metadata and controls
113 lines (89 loc) · 2.21 KB
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
/**
* generic.cpp
* 2022-06-01 K.OHWADA
*/
// generic implementation
// https://qiita.com/kurun_pan/items/f2edd3b834dcaeaa8b2f
#include <iostream>
#include <memory>
/**
* class MessegeHandler
*/
class MessegeHandler {
public:
MessegeHandler() = default;
virtual ~MessegeHandler() = default;
void onSuccess() {
onSuccessInternal();
}
void onError(const std::string& message) {
onErrorInternal(message);
}
protected:
virtual void onSuccessInternal() = 0;
virtual void onErrorInternal(const std::string& message) = 0;
};
using MessegeHandlerImpleOnSuccess = std::function<void(void)>;
using MessegeHandlerImpleError = std::function<void(const std::string& message)>;
/**
* class MessegeHandlerImple
*/
class MessegeHandlerImple : public MessegeHandler {
public:
MessegeHandlerImple(MessegeHandlerImpleOnSuccess on_success,
MessegeHandlerImpleError on_error)
: on_success_(on_success), on_error_(on_error) {}
virtual ~MessegeHandlerImple() = default;
protected:
void onSuccessInternal() override {
if (on_success_)
on_success_();
}
void onErrorInternal(const std::string& message) override {
if (on_error_)
on_error_(message);
}
private:
MessegeHandlerImpleOnSuccess on_success_;
MessegeHandlerImpleError on_error_;
};
/**
* class Messenger
*/
class Messenger {
public:
Messenger() = default;
~Messenger() = default;
void setHandler(std::unique_ptr<MessegeHandler> handler) {
handler_ = std::move(handler);
}
void sendMessage(const std::string& message) {
if (message.size() == 0) {
if (handler_)
handler_->onError("error message");
return ;
}
if (handler_)
handler_->onSuccess();
}
private:
std::unique_ptr<MessegeHandler> handler_;
};
/**
* main
*/
int main() {
auto messenger = std::make_unique<Messenger>();
auto handler = std::make_unique<MessegeHandlerImple>(
[]() {
std::cout << "call OnCuccess()" << std::endl;
},
[](const std::string& message) {
std::cout << "call OnError(): " << message << std::endl;
}
);
messenger->setHandler(std::move(handler));
messenger->sendMessage("Send message");
messenger->sendMessage("");
return 0;
}