当前位置: 首页 > 编程笔记 >

C++:状态模式

经国安
2023-04-24

模式定义

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

状态模式的优点

结构清晰

遵循设计原则

封装性非常好

状态模式的缺点

状态模式既然有优点, 那当然有缺点了。 但只有一个缺点, 子类会太多, 也就是类膨胀。 如果一个事物有很多个状态也不稀奇, 如果完全使用状态模式就会有太多的子类, 不好管理, 这个需要大家在项目中自己衡量。

状态模式的应用场景

● 行为随状态改变而改变的场景

这也是状态模式的根本出发点, 例如权限设计, 人员的状态不同即使执行相同的行为结果也会不同, 在这种情况下需要考虑使用状态模式。

● 条件、 分支判断语句的替代者

在程序中大量使用switch语句或者if判断语句会导致程序结构不清晰, 逻辑混乱, 使用状态模式可以很好地避免这一问题, 它通过扩展子类实现了条件的判断处理。

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 = OpenState::getInstance();
	}

	void Operation3() {
		pNext = OpenState::getInstance();
	}
};
class CloseState :public NetworkState {
	static NetworkState* m_instance;
public:
	static NetworkState* getInstance() {
		if (m_instance == nullptr) {
			m_instance = new CloseState();
		}
		return m_instance;
	}
	void Operation1() {
		pNext = CloseState::getInstance();
	}

	void Operation2() {
		pNext = OpenState::getInstance();
	}

	void Operation3() {
		pNext = OpenState::getInstance();
	}
};
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;
	}
};
 类似资料:
  • 主要内容:介绍,实现,State.java,StartState.java,StopState.java,Context.java,StatePatternDemo.java,更多文章在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依

  • 状态模式的关键是区分事物内部的状态,事物内部状态的改变往往会带来事物的行为改变。 当电灯开着,此时按下开关,电灯会切换到关闭状态;再按一次开关,电灯又将被打开。同一个开关在不同的状态下,表现出来的行为是不一样的。 一、有限状态机 状态总数(state)是有限的。 任一时刻,只处在一种状态之中。 某种条件下,会从一种状态转变(transition)到另一种状态。 允许一个对象在其内部状态改变时改变它

  • 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用:代码中

  • 简介 状态模式,当一个对象在内在状态改变时,允许改变起行为,这个对象看起来像是改变了其类。 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。 简例 工作状态-分类板 public class Work { private int hour; public int Hour {

  • 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 介绍 意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 何时使用:代码中

  • 状态模式 状态模式是协议交互中使用得比较多的模式。比如说,在不同的协议中,都会存在启动、保持、中止等基本状态。那么怎么灵活地转变这些状态就是我们需要考虑的事情。假设现在有一个state, typedef struct _State { void (*process)(); struct _State* (*change_state)(); }State; 说明一