C语言中如何实现状态模式来管理对象状态转换?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1276个文字,预计阅读时间需要6分钟。
状态变化模式在组件构建过程中,某些对象的状态经常面临变化。如何有效管理这些变化,同时保持高层模块的稳定性,是一个关键问题。以下提供一种解决方案。
状态变化模式通过将对象的状态和行为封装在单独的状态对象中,来应对频繁的状态变化。这样,状态的改变不会影响到其他对象,从而保持系统的稳定性。
具体步骤如下:
1. 定义状态接口,包含所有可能的状态方法。
2.实现具体状态类,实现状态接口,处理状态变化时的具体逻辑。
3.定义环境类,包含状态对象的引用,并提供状态转换的方法。
4.在环境类中,根据状态变化的需求,动态切换状态对象。
通过状态变化模式,可以实现以下优势:
- 状态管理独立:状态变化与对象的其他行为分离,降低模块间的耦合度。
- 灵活扩展:新增状态时,只需实现新的状态类,无需修改现有代码。- 稳定性:高层模块无需关心状态变化的具体实现,降低因状态变化导致的系统崩溃风险。以下是一个简化的状态变化模式示例:
python状态接口class State: def handle_event(self): pass
具体状态类class StateA(State): def handle_event(self): print(Handling event in StateA)
class StateB(State): def handle_event(self): print(Handling event in StateB)
环境类class Context: def __init__(self): self.state=StateA()
def change_state(self, new_state): self.state=new_state
def handle_event(self): self.state.handle_event()
测试context=Context()context.handle_event() # 输出:Handling event in StateAcontext.change_state(StateB())context.handle_event() # 输出:Handling event in StateB
以上示例展示了如何使用状态变化模式管理状态变化,并保持系统稳定性。
状态变化模式- 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
- State
- Memento
- 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
- 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
结构 要点总结- State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况 ,因为转换是原子性的一即要么彻底转换过来,要么不转换。
- 如果State对象没有实例变量,那么各个.上下文可以共享同一个State对象,从而节省对象开销。
23种设计模式不比太过于计较它们之间的差异,而更关注他们到底解决的是什么样的一个稳定点和变化点的关系问题。这个时候呢模式之间的关系也理顺了,学习模式一那么生搬硬套,它无非是设计上的演化而已,是一种松耦合设计的原则演化而已。
可以把state和Strateg看成同一种模式,就是出现问题:if-else,枚举。该怎末转?用多态的方式实现运行时的改变,具体是什么模式在开发过程中没那么重要。
if-elseenum 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(){
}
};
多态,运行时的if-else
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;
//...
}
};
本文共计1276个文字,预计阅读时间需要6分钟。
状态变化模式在组件构建过程中,某些对象的状态经常面临变化。如何有效管理这些变化,同时保持高层模块的稳定性,是一个关键问题。以下提供一种解决方案。
状态变化模式通过将对象的状态和行为封装在单独的状态对象中,来应对频繁的状态变化。这样,状态的改变不会影响到其他对象,从而保持系统的稳定性。
具体步骤如下:
1. 定义状态接口,包含所有可能的状态方法。
2.实现具体状态类,实现状态接口,处理状态变化时的具体逻辑。
3.定义环境类,包含状态对象的引用,并提供状态转换的方法。
4.在环境类中,根据状态变化的需求,动态切换状态对象。
通过状态变化模式,可以实现以下优势:
- 状态管理独立:状态变化与对象的其他行为分离,降低模块间的耦合度。
- 灵活扩展:新增状态时,只需实现新的状态类,无需修改现有代码。- 稳定性:高层模块无需关心状态变化的具体实现,降低因状态变化导致的系统崩溃风险。以下是一个简化的状态变化模式示例:
python状态接口class State: def handle_event(self): pass
具体状态类class StateA(State): def handle_event(self): print(Handling event in StateA)
class StateB(State): def handle_event(self): print(Handling event in StateB)
环境类class Context: def __init__(self): self.state=StateA()
def change_state(self, new_state): self.state=new_state
def handle_event(self): self.state.handle_event()
测试context=Context()context.handle_event() # 输出:Handling event in StateAcontext.change_state(StateB())context.handle_event() # 输出:Handling event in StateB
以上示例展示了如何使用状态变化模式管理状态变化,并保持系统稳定性。
状态变化模式- 在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。
- State
- Memento
- 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能完全不同。
- 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入紧耦合?
允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。
结构 要点总结- State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。
- 为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况 ,因为转换是原子性的一即要么彻底转换过来,要么不转换。
- 如果State对象没有实例变量,那么各个.上下文可以共享同一个State对象,从而节省对象开销。
23种设计模式不比太过于计较它们之间的差异,而更关注他们到底解决的是什么样的一个稳定点和变化点的关系问题。这个时候呢模式之间的关系也理顺了,学习模式一那么生搬硬套,它无非是设计上的演化而已,是一种松耦合设计的原则演化而已。
可以把state和Strateg看成同一种模式,就是出现问题:if-else,枚举。该怎末转?用多态的方式实现运行时的改变,具体是什么模式在开发过程中没那么重要。
if-elseenum 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(){
}
};
多态,运行时的if-else
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;
//...
}
};

