苏州seo网站推广公司,58同城推广,网站开发自学难吗,软件ui定义
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
应用场景
在软件构建过程中#xff0c;某些对象的状态如果改变#xff0c;其行为也会随之#xff0c;而发生变化#xff0c;比如文档处于只读状态#xff0c;其支持的行为和读写…定义
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
应用场景
在软件构建过程中某些对象的状态如果改变其行为也会随之而发生变化比如文档处于只读状态其支持的行为和读写状态支持的行为就可能完全不同。如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
结构 代码示例
//State.h
/****************************************************/
#ifndef STATE_H
#define STATE_H
#include iostream
using namespace std;
class Lamp;// 抽象状态类
class State
{
public:// 析构函数virtual ~State() {}// 操作函数virtual void handle(Lamp context) 0;};// 具体状态类-开
class StateOn : public State
{
public:// 操作函数virtual void handle(Lamp context);};// 具体状态类-关
class StateOff : public State
{
public:// 操作函数virtual void handle(Lamp context);};// 灯
class Lamp
{
public:// 构造函数默认状态关闭Lamp() : m_state(new StateOff()){}// 析构函数~Lamp();// 设置状态void setState(State* state);// 请求void request();private:State* m_state;
};// 操作函数
void StateOn::handle(Lamp context) {cout 当前状态打开 endl;cout 执行操作关闭 endl;context.setState(new StateOff());
}// 操作函数
void StateOff::handle(Lamp context) {cout 当前状态关闭 endl;cout 执行操作打开 endl;context.setState(new StateOn());
}// 析构函数
Lamp::~Lamp() {if (m_state) {delete m_state;m_state nullptr;}
}// 设置状态
void Lamp::setState(State* state) {if (m_state) {delete m_state;m_state nullptr;}m_state state;
}// 请求
void Lamp::request() {m_state-handle(*this);
}#endif//test.cpp
/****************************************************/
#include State.hint main()
{Lamp lamp;lamp.request(); // 操作灯lamp.request(); // 操作灯return 0;
}运行结果
要点总结
State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中在对象状态切换时切换相应的对象;但同时维持State的接口这样实现了具体操作与状态转换之间的解耦。为不同的状态引入不同的对象使得状态转换变得更加明确而且可以保证不会出现状态不一致的情况因为转换是原子性的——即要么彻底转换过来要么不转换。如果State对象没有实例变量那么各个上下文可以共享同一个State对象从而节省对象开销。