-
Notifications
You must be signed in to change notification settings - Fork 0
/
13.command_pattern.h
146 lines (137 loc) · 3.11 KB
/
13.command_pattern.h
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
//
// Created by Tianyi Zhang on 2/1/21.
//
#ifndef DESIGN_PATTERN_13_COMMAND_PATTERN_H
#define DESIGN_PATTERN_13_COMMAND_PATTERN_H
#include <iostream>
#include <memory>
#include <vector>
#include <stack>
//controlled items
struct Light{
Light():on_(false){}
bool on_;
void on(){
on_ = true;
std::cout<<"light is on"<<std::endl;
}
void off(){
on_ = false;
std::cout<<"light is off"<<std::endl;
}
};
struct Fan{
Fan():on_(false){}
bool on_;
void on(){
on_ = true;
std::cout<<"fan is on"<<std::endl;
}
void off(){
on_ = false;
std::cout<<"fan is off"<<std::endl;
}
};
struct Command{
public:
virtual void execute() = 0;
virtual void undo() = 0;
virtual ~Command(){}
};
struct LightOnCommand : public Command{
LightOnCommand(std::shared_ptr<Light> light){
this->light_ = light;
}
void execute() override{
prev_ = light_->on_;
light_->on();
}
void undo() override{
if(prev_)
light_->on();
else if(!prev_)
light_->off();
}
private:
std::shared_ptr<Light> light_;
bool prev_;
};
struct LightOffCommand : public Command{
LightOffCommand(std::shared_ptr<Light> light){
this->light_ = light;
}
void execute() override{
prev_ = light_->on_;
light_->off();
}
void undo() override{
if(prev_)
light_->on();
else if(!prev_)
light_->off();
}
private:
std::shared_ptr<Light> light_;
bool prev_;
};
struct FanOnCommand : public Command{
FanOnCommand(std::shared_ptr<Fan> fan){
this->fan_ = fan;
}
void execute() override{
prev_ = fan_->on_;
fan_->on();
}
void undo() override{
if(prev_)
fan_->on();
else if(!prev_)
fan_->off();
}
private:
std::shared_ptr<Fan> fan_;
bool prev_;
};
struct FanOffCommand : public Command{
FanOffCommand(std::shared_ptr<Fan> fan){
this->fan_ = fan;
}
void execute() override{
fan_->off();
}
void undo() override{
if(prev_)
fan_->on();
else if(!prev_)
fan_->off();
}
private:
std::shared_ptr<Fan> fan_;
bool prev_;
};
struct RemoteControl{
RemoteControl(int numSlot){
onCommands_.reserve(numSlot);
offCommands_.reserve(numSlot);
}
void setCommand(int slot, std::shared_ptr<Command> onCommand, std::shared_ptr<Command> offCommand){
onCommands_[slot] = onCommand;
offCommands_[slot] = offCommand;
}
void onButtonPushed(int slot){
onCommands_[slot]->execute();
undoCommand_ = onCommands_[slot];
}
void offButtonPushed(int slot){
offCommands_[slot]->execute();
undoCommand_ = offCommands_[slot];
}
void undoCommandpushed(){
undoCommand_->undo();
}
private:
std::vector<std::shared_ptr<Command>> onCommands_;
std::vector<std::shared_ptr<Command>> offCommands_;
std::shared_ptr<Command> undoCommand_;
};
#endif //DESIGN_PATTERN_13_COMMAND_PATTERN_H