您的位置:首页 > 健康 > 养生 > 江苏市场监督管理局app_百度竞价是什么意思_技术培训机构_河南网站推广多少钱

江苏市场监督管理局app_百度竞价是什么意思_技术培训机构_河南网站推广多少钱

2024/12/23 17:06:36 来源:https://blog.csdn.net/John_ToStr/article/details/142599603  浏览:    关键词:江苏市场监督管理局app_百度竞价是什么意思_技术培训机构_河南网站推广多少钱
江苏市场监督管理局app_百度竞价是什么意思_技术培训机构_河南网站推广多少钱

前言

        在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定? “状态变化” 模式为这一问题提供了一种解决方案

定义

        允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为

动机

        在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同

        如何在运行时根据对象的状态来透明的更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?

案例

        代码

// 版本1
enum NetworkState
{Network_Open,Network_Close,Network_Connect,
};class NetworkProcessor{NetworkState state;
public:void Operation1(){if (state == Network_Open){//**********state = Network_Close;}else if (state == Network_Close){//..........state = Network_Connect;}else if (state == Network_Connect){//$$$$$$$$$$state = Network_Open;}}public void Operation2(){if (state == Network_Open){     //**********state = Network_Connect;}else if (state == Network_Close){//.....state = Network_Open;}else if (state == Network_Connect){//$$$$$$$$$$state = Network_Close;}}public void Operation3(){}
};// 版本2
class NetworkState{
public:NetworkState* pNext;virtual void Operation1()=0;virtual void Operation2()=0;virtual void Operation3()=0;virtual ~NetworkState(){}
};class OpenState :public NetworkState{   static NetworkState* m_instance;
public:static NetworkState* getInstance(){if (m_instance == nullptr) {m_instance = new OpenState();}return m_instance;}void Operation1(){       //**********pNext = CloseState::getInstance();}void Operation2(){   //..........pNext = ConnectState::getInstance();}void Operation3(){  //$$$$$$$$$$pNext = OpenState::getInstance();} 
};class CloseState:public NetworkState{ }
//...class NetworkProcessor{NetworkState* pState;
public:NetworkProcessor(NetworkState* pState){  this->pState = pState;}void Operation1(){//...pState->Operation1();pState = pState->pNext;//...}void Operation2(){//...pState->Operation2();pState = pState->pNext;//...}void Operation3(){//...pState->Operation3();pState = pState->pNext;//...}
};

类图

        

总结

        状态模式将所有与一个特定状态相关的行为都放入一个状态的子类对象中,在对象状态切换时,切换相应的对象;但同时维持状态的接口,这样实现了具体操作与状态转换之间的解耦

        为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换是原子性的——即要么彻底转换过来,要么不转换

        如果状态对象没有实例变量,那么各个上下文可以共享同一个状态对象,从而节省对象开销

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com