[C++设计模式] state 状态模式
2023-09-14 09:06:20 时间
《head first 设计模式》中的样例非常不错,想制造一个自己主动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄。
糖果机的当前状态处于当中不同的状态时,它针对同一个操作的反映动作也不同。
传统面向过程编程会套用if-else对不同的状态下分别处理,逻辑麻烦并且不具有可拓展性。
状态模式:同意一个对象在其内部状态改变时改变它的行为。对象看起来似乎改动了它的类。
状态模式的重点在于状态转换,非常多时候。对于一个对象的状态,我们都是让这个对象包括一个状态的属性,这个状态属性记录着对象的详细状态,依据状态的不同使用分支结构来运行不同的功能。就像上面的代码那样处理。就像上面说的。类中存在大量的结构类似的分支语句,变得难以维护和理解。状态模式消除了分支语句。就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散到各个状态子类中去。每一个子类集中处理一种状态,这样就使得状态的处理和转换清晰明白
State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。
ConcreteState类,详细状态,每个子类实现一个与Context的一个状态相关的行为。
Context类,维护一个ConcreteState子类的实例。这个实例定义当前的状态。
给出框架。不再实现,比較好理解。
class Context; class State { public: virtual void Handle(Context* pContext)=0; ~State(); protected: State(); private: }; class ConcreteStateA : public State { public: ConcreteStateA(); ~ConcreteStateA(); virtual void Handle(Context* pContext); protected: private: }; class ConcreteStateB : public State { public: ConcreteStateB(); ~ConcreteStateB(); virtual void Handle(Context* pContext); protected: private: }; class ConcreteStateC : public State { public: ConcreteStateC(); ~ConcreteStateC(); virtual void Handle(Context* pContext); protected: private: }; class Context { public: Context(State* pState); ~Context(); void Request(); void ChangeState(State* pState); protected: private: State* _state; };
相关文章
- C++ 内联函数
- C++ pair 类型
- C/C++每日一练(20230227)
- C语言/C++常见习题问答集锦(五十五) 之矩形类处理程序
- Open3D (C++) 基于投影点密度的建筑物立面提取
- Open3D(C++) 模型简化——顶点聚类
- [转] c++ try catch 问题
- 软考中级(软件设计师)——面向对象程序设计(C++&Java二选一的题15分-目标3分)
- 【面试攻略】C++面试基础篇2
- C++多个有序数组的交集
- C++设计模式——状态模式(State)
- C++设计模式——状态模式(State)
- c++中string替换字符串中某段字符
- C++ 容器:顺序性容器、关联式容器和容器适配器
- c++ :: 用法一
- 详解c++[指针的指针] 和 [指针的引用](五十五)
- C++设计模式之状态模式(四)
- C++的学习心得和知识总结(十九)|基于Libpq实现C++访问PostgreSQL数据库