C++ 设计模式之状态模式的使用
来源:互联网 发布:rj45都有网络变压器吗 编辑:程序博客网 时间:2024/06/03 13:47
状态模式
(State Pattern)是设计模式的一种,属于行为模式。
定义
(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
意图
允许一个对象在其内部状态改变时改变它的行为
适用场景
1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
状态模式uml类图
以下为C++代码实现:
头文件#ifndef __STATE_H__#define __STATE_H__#include "Context.h"#include <iostream>class Context;class BaseState {public: virtual void Handle(Context* context) = 0;};class ConcreteStateA : public BaseState {public: void Handle(Context* context);};class ConcreteStateB : public BaseState {public: void Handle(Context* context);};#endif源文件#include "State.h"void ConcreteStateA::Handle(Context* context) { std::cout << "当前状态是:A" << std::endl; context->setState(new ConcreteStateB());}void ConcreteStateB::Handle(Context* context) { std::cout << "当前状态是:B" << std::endl; context->setState(new ConcreteStateA());}
头文件#ifndef __CONTEXT_H__#define __CONTEXT_H__#include "State.h"#include <iostream>class BaseState;class Context {public: Context(BaseState* state); ~Context(); void setState(BaseState* state); BaseState* getState(); void request();public: BaseState* m_state;};#endif源文件#include "Context.h"Context::Context(BaseState* state) { this->m_state = state;}Context::~Context() {}void Context::setState(BaseState* state) { this->m_state = state;}BaseState* Context::getState() { return this->m_state;}void Context::request() { m_state->Handle(this);}
应用代码
#include "State.h"#include "Context.h"#include <iostream>int main() { Context* context = new Context(new ConcreteStateA()); context->request(); context->request(); context->request(); context->request(); std::cout << "Hello World" << std::endl; return 0;}
结果如下所示:
当前状态是:A
当前状态是:B
当前状态是:A
当前状态是:B
0 0
- 设计模式之状态模式(c++)
- C++ 设计模式之状态模式的使用
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之--状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- 设计模式之状态模式
- Maven仓库公共地址和查询地址
- android 性能优化
- 随机数练习1,和电脑比roll点
- [C#开发] 进制间的转换
- KVO 与KVC
- C++ 设计模式之状态模式的使用
- .NET跨平台机制一(mono for android配置教程)
- NSLayoutConstraint
- 第七周 项目三:第八章知识点思维导图
- 深度探索C++对象模型-构造函数语义学
- 索引碎片修复
- 软件管理培训总结
- IOS尺寸与规范(ICON命名规则)
- 移动构造函数和移动赋值运算符