[设计模式笔记]三. 行为型模式--22. State模式(状态)对象行为型模式(一)

行为型模式--State模式(状态)对象行为型模式

一. 意图


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

(状态与行为绑定状态变了行为也就随之改变.).


二. 适用性


在下面的两种情况下均可使用State模式:

一个对象的行为取决于它的状态并且它必须在运行时刻根据状态改变它的行为.

一个操作中含有庞大的多分支的条件语句且这些分支依赖于该对象的状态这个状态通常用一个或多个枚举常量表示通常,  有多个操作包含这一相同的条件结构State模式将每一个条件分支放入一个独立的类中这使得你可以根据对象自身的情况将对象的状态作为一个对象, 这一对象可以不依赖于其他对象而独立变化..


三. 模式结构


图1 


四. 角色说明


Context(上下文)

—定义客户感兴趣的接口。

—维护一个ConcreteState子类的实例这个实例定义当前状态.


State(状态)

—定义一个接口以封装与Context的一个特定状态相关的行为.


ConcreteState subclasses(具体状态子类)

—每一子类实现一个与Context的一个状态相关的行为.


协作

Context将与状态相关的请求委托给当前的ConcreteState对象处理.

Context可将自身作为一个参数传递给处理该请求的状态对象这使得状态对象在必要时可访问Context.

Context是客户使用的主要接口客户可用状态对象来配置一个Context, 一旦一个Context配置完毕它的客户不再需要直接与状态对象打交道.

ContextConceteState子类都可决定哪个状态是另外哪一个的后继者以及是在何种条件下进行状态转换.


五. 说明


1. State模式将所有与一个特定的状态相关的行为都放入一个对象中通过定义新的子类可以很容易的增加新的状态和转换.

2. State模式将不同状态的行为分布在多个State子类中这就增加了子类的数目相对于单个类的实现来说不够紧凑.

3. 它使得状态转换显式化为不同的状态引入独立的对象使得转换变得更加明确.

4. State对象可被共享.(使用Flyweight模式). 


我的理解


1. 在写一个程序时程序的状态非常重要通常程序需要根据当前的状态来做对应的事情很常用的方法是使用一个值代表一个状态例如int nState = 0;然后使用if或者switch来判断nState的值根据它的值做不同的事情.


2. State模式中状态则使用一个类对象表示一个状态就有一个类(运行时是类对象), 并且该类中有对应该类要做的事情的执行代码(状态与对应的行为被绑定在语言层次上而不是通过if/switch绑定在代码层次上).


3. 根据State模式的结构图

例如:

class Context
{
public:
	...
	void SetState(State* pState);
	void Request();
private:
	State* m_pState;
};
...
void Context::SetState(State* pState)
{
	m_pState = pState;
}

void Context::Request()
{
	if(m_pState)
	{
		m_pState->Handle();
	}
}

/
class State
{
public:
	...
	virtual void Handle();
};


class ConcreteStateA
{
public:
	...
	virtual void Handle();
};

void ConcreteStateA::Handle()
{
	int i = 0;
}

class ConcreteStateB
{
public:
	...
	virtual void Handle();
};

void ConcreteStateB::Handle()
{
	int k = 0;
}
......

// Client
// 调用(在某种情况下, Context的状态被改变了)
// 状态绑定
pContext->SetState(new ConcreteStateB);
...
// 执行Context当前状态的行为
pContext->Request();


4. 在实际应用中a. 我们需要删除不使用的状态(状态改变时,,需要删除前一个状态对象), 但是如果状态变化很频繁而且状态对象比较大时频繁的删除会带来开销.(可以使用Flyweight模式如果条件满足的话.) b. Handle()函数可以有一些参数看需求.


5. State模式中把各个状态的操作分布到各个具体State子类中如果不使用State模式这些行为可能就集中到一个类中了.


6. 这种模式不只是用到状态的改变中例如曾经做过一个服务端它接收不同命令根据命令的不同来做不同的事情那实现的时候也可以使用这种模式一个命令对应一个类类中执行该命令对应的行为这场景与State模式是一致的.


七. 相关模式


Flyweight模式解释了何时以及怎样共享状态对象状态对象通常是Singleton.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值