前言 状态、命令和观察者模式(行为型设计模式)的 C++ 代码示例模板。
代码仓库
状态模式(State) 结构
抽象状态类
具体状态类
上下文类
抽象状态类 封装 处理方法
具体状态类 重写 处理方法
上下文类 封装 抽象状态指针(实际上指向一个具体状态对象)
上下文类 封装 转换状态方法(删除上一个状态即当前状态, 保存下一个状态为当前状态)
上下文类 封装 处理状态方法(形式上 调用 上下文类的 处理状态方法,实际上 调用 具体状态对象的处理方法)
代码
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 #include <iostream> using std::cout;using std::endl;class AbstractState { public : virtual void handle () = 0 ; }; class ConcreteState1 : public AbstractState{ public : void handle () override { cout << "ConcreteState1" << endl; } }; class ConcreteState2 : public AbstractState{ public : void handle () override { cout << "ConcreteState2" << endl; } }; class Context { public : void convert_state (AbstractState *next_state) { delete this ->current_state; this ->current_state = next_state; } void handle_state () { this ->current_state->handle (); } private : AbstractState *current_state = nullptr ; }; int main () { AbstractState *abstract_state_1 = new ConcreteState1 (); AbstractState *abstract_state_2 = new ConcreteState2 (); Context context; context.convert_state (abstract_state_1); context.handle_state (); context.convert_state (abstract_state_2); context.handle_state (); delete abstract_state_2; return 0 ; }
命令模式(Command) 结构
接收者类
抽象命令类
具体命令类
发送者类
接收者类 封装 行为方法
抽象命令类 封装 执行方法
具体命令类 重写 执行方法(形式上 调用 具体命令对象的执行方法,实际上 调用 接收者对象的行为方法)
具体命令类 封装 接收者对象(如果在 抽象命令类 封装 接收者对象,接收者类型一致;如果在 具体命令类 封装 接收者对象,接收者类型可以不同)
发送者类 封装 抽象命令指针(实际上指向一个具体命令对象)
发送者类 封装 设置命令方法 和 执行命令方法(形式上 调用 发送者对象的执行命令方法,实际上 调用 具体命令对象的执行方法)
命令执行过程:发送者 调用 执行命令方法 -> 命令 调用 执行方法 -> 接收者 调用 行为方法
代码
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 #include <iostream> using std::cout;using std::endl;class Receiver { public : void action () { cout << "Receiver" << endl; } }; class AbstractCommand { public : virtual void execute () = 0 ; }; class ConcreteCommand : public AbstractCommand{ public : ConcreteCommand () : receiver () {} virtual void execute () override { receiver.action (); } private : Receiver receiver; }; class Sender { public : void set_command (AbstractCommand *abstract_command) { this ->abstract_command = abstract_command; } void execute_command () { this ->abstract_command->execute (); } private : AbstractCommand *abstract_command; }; int main () { AbstractCommand *abstract_command = new ConcreteCommand (); Sender sender; sender.set_command (abstract_command); sender.execute_command (); delete abstract_command; return 0 ; }
观察者模式(Observer) 结构
抽象观察者类
具体观察者类
抽象目标类
具体目标类
抽象观察者类 封装 更新方法
具体观察者类 重写 更新方法
抽象目标类 封装 抽象观察者指针(实际上指向一个具体观察者对象)的集合属性,添加观察者方法,移除观察者方法,通知观察者方法(形式上 调用 具体目标对象的 通知观察者方法,实际上 调用 具体观察者对象的 更新方法)
抽象目标类 封装 状态属性,设置状态方法(设置状态后,通知观察者),获取状态方法
观察过程:目标设置(改变)状态 -> 通知观察者 -> 观察者更新
代码
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 #include <string> #include <iostream> #include <vector> #include <algorithm> using std::cout;using std::endl;using std::string;using std::vector;class AbstractObserver { public : virtual void update (string message) = 0 ; }; class ConcreteObserver : public AbstractObserver{ public : ConcreteObserver (string name) : name (name) {} void update (string message) override { cout << "Observer " << this ->name << " receives message: " << message << endl; } private : string name; }; class AbstractTarget { public : virtual ~AbstractTarget () { for (AbstractObserver *observer : this ->observer_vec) { delete observer; } this ->observer_vec.clear (); } void add_observer (AbstractObserver *observer) { this ->observer_vec.push_back (observer); } void remove_observer (AbstractObserver *observer) { vector<AbstractObserver *>::iterator it = std::remove (this ->observer_vec.begin (), this ->observer_vec.end (), observer); this ->observer_vec.erase (it, this ->observer_vec.end ()); } void notify_observer (string message) { for (AbstractObserver *observer : this ->observer_vec) { observer->update (message); } } void set_state (string state) { this ->state = state; this ->notify_observer ("State changes to: " + this ->state); } private : vector<AbstractObserver *> observer_vec; string state; }; class ConcreteTarget : public AbstractTarget{ }; int main () { ConcreteTarget concrete_target; AbstractObserver *concrete_observer_1 = new ConcreteObserver ("concrete_observer_1" ); AbstractObserver *concrete_observer_2 = new ConcreteObserver ("concrete_observer_2" ); concrete_target.add_observer (concrete_observer_1); concrete_target.add_observer (concrete_observer_2); concrete_target.set_state ("state1" ); concrete_target.remove_observer (concrete_observer_1); delete concrete_observer_1; concrete_target.set_state ("state2" ); return 0 ; }
总结 状态、命令模式和观察者模式(行为型设计模式)的 C++ 代码示例模板。
参考资料
作者的话
感谢参考资料的作者/博主
作者:夜悊
版权所有,转载请注明出处,谢谢~
如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
文章在认识上有错误的地方, 敬请批评指正
望读者们都能有所收获