设计模式_状态模式

标签: 状态模式 设计模式 c++ 完整可运行代码 新手
160人阅读 评论(0) 收藏 举报
分类:

状态模式

(1)在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

(2)状态模式UML图:


(3)在状态模式结构图中包含如下几个角色:

       ● Context(环境类):环境类又称为上下文类,它是拥有多种状态的对象。由于环境类的状态存在多样性且在不同状态下对象的行为有所不同,因此将状态独立出去形成单独的状态类。在环境类中维护一个抽象状态类State的实例,这个实例定义当前状态,在具体实现时,它是一个State子类的对象。

       ● State(抽象状态类):它用于定义一个接口以封装与环境类的一个特定状态相关的行为,在抽象状态类中声明了各种不同状态对应的方法,而在其子类中实现类这些方法,由于不同状态下对象的行为可能不同,因此在不同子类中方法的实现可能存在不同,相同的方法可以写在抽象状态类中。

       ● ConcreteState(具体状态类):它是抽象状态类的子类,每一个子类实现一个与环境类的一个状态相关的行为,每一个具体状态类对应环境的一个具体状态,不同的具体状态类其行为有所不同。

(4)在状态模式的使用过程中,一个对象的状态之间还可以进行相互转换,通常有两种实现状态转换的方式:

          1. 统一由环境类来负责状态之间的转换,此时,环境类还充当了状态管理器(State Manager)角色,在环境类的业务方法中通过对某些属性值的判断实现状态转换。

          2. 由具体状态类来负责状态之间的转换,可以在具体状态类的业务方法中判断环境类的某些属性值再根据情况为环境类设置新的状态对象,实现状态转换

(5)完整可运行的代码

电灯拥有开和关两种状态,我们只需要点击电灯的开关即可实现打开和关闭不停的切换,下面的实例中状态的切换是在具体的状态中。

light.hxx文件:定义了电灯类

#include"state.hxx"
class XState;
class Light
{
public:
	Light(XState* state) { maState = state; }
	void setState(XState * state) { maState = state; }
	void request();
private:
	XState* maState;
};
light.cpp文件:电灯类的具体实现

#include"light.hxx"
void Light::request()
{
	maState->handle(this);
}
实现了关键接口request(),调用具体状态的处理函数。

state.hxx文件:定义了状态类

#include"light.hxx"
class Light;
class XState
{
public:
	virtual void handle(Light* light) = 0;
};
//开灯状态
class onState : public XState
{
public:
	void handle(Light* light) override;
};
//关灯状态
class offState :public XState
{
public:
	void handle(Light* light) override;
};
state.cxx文件:状态类的实现

#include<iostream>
#include"state.hxx"
using namespace std;
//当是开灯状态下,点击电灯电源按钮,电灯切换到关灯状态,关闭电灯。
void onState::handle(Light* light)
{
	cout << "turn off the light"<< endl;
	light->setState(new offState);
}
//当是关灯状态下,点击电灯电源按钮,电灯切换到开灯状态,打开电灯。
void offState::handle(Light* light)
{
	cout << "turn on the ligth"<< endl;
	light->setState(new onState);
}

可以看到在状态类中进行了状态切换,就是上面提到的第二种转换方案。

main.cxx文件:

#include<iostream>
#include"light.hxx"
#include"state.hxx"
int main()
{	//初始为关灯状态。
	XState* offstate = new offState();
	Light* light = new Light(offstate);
	light->request();
	light->request();
	system("pause");
	return 0;
}
light不停的调用request(),状态在不停的切换,电灯在不停的打开和关闭。一个对象(电灯)在其内部状态改变时改变它的行为(开/关灯),对象看起来似乎修改了它的类,这就是状态模式。

(6)运行截图:


 (7)状态模式和策略模式的区别:

看UML图,他们两基本一模一样。

区别:
状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;
而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。

查看评论

<十二>读<<大话设计模式>>之状态模式

对于状态模式,>是以人从上班到下班到加班的状态来展开讲述的。状态模式其实就是某一个对象在某个过程或者时间的一个状态记录,但是这个状态的顺序不能发生变化,在程序设计方面可能要比其他模式稍微复杂点,请待我...
  • jzhf2012
  • jzhf2012
  • 2014-11-06 13:22:27
  • 1746

【设计模式】学习笔记14:状态模式(State)

认识状态模式 假设有一个糖果机, 它的工作状态图如下:要用代码实现糖果机的功能, 如果不用状态模式: 一种方法是创建一个类,它的作用就是一个状态机,对每一个动作,我们都创建了一个对应的方法,这些方法...
  • shuangde800
  • shuangde800
  • 2013-08-22 00:15:46
  • 22040

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城...
  • u012401711
  • u012401711
  • 2016-09-26 23:45:36
  • 4689

C语言实现状态设计模式

#include #include #include #ifndef VIRTUAL #define VIRTUAL #endif #ifndef DELETE #define DELETE...
  • ma52103231
  • ma52103231
  • 2014-05-09 18:13:23
  • 1118

设计模式(行为型)之状态模式(State Pattern)

状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态...
  • yanbober
  • yanbober
  • 2015-05-05 15:32:56
  • 4237

Java 设计模式——状态模式

很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像。你可以阅读《Java设计模式——策略模式》这篇博客,并与本文对比,以找到蛛丝马迹。 他们最根本的...
  • u013761665
  • u013761665
  • 2016-06-06 16:46:00
  • 9148

设计模式——状态模式(有限状态机)

状态模式适用的情况:一个context对象根据其所处的状态改变其行为。在状态模式中,我们通过创建不同的state对象来表示不同的状态,而context对象则根据不同的state对象表现出不同的行为。状...
  • GW569453350game
  • GW569453350game
  • 2015-12-29 17:11:45
  • 3819

Java设计模式18——状态模式

一、定义状态(State)模式又称为状态对象模式(Pattern of Objects for State),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变时改变其行为,用于解决系统中...
  • xu__cg
  • xu__cg
  • 2016-11-16 19:46:08
  • 1071

设计模式之状态模式的理解运用

引语: 我们在编程的时候,有时会遇到一些情况,那就是对象的行为动作会由当时对象所处的状态来决定。例如,我们在微博上看到一篇文章,觉得还不错,于是想评论或者转发,但如果用户没有登录,这个时候就会先自动...
  • yus201120
  • yus201120
  • 2016-12-13 18:40:47
  • 234

<<Head First设计模式>>之状态模式学习篇

最近在公司闲着没事干,看了一下>一书,感觉还蛮有意思,设计模式涉及到OO的设计思想和OO的设计原则。这本书是采用Java语言描述的。由于我比较熟悉C++,所以看完之后想使用C++来实现。由于想要结合状...
  • ccf19881030
  • ccf19881030
  • 2012-12-04 21:53:56
  • 6445
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 498
    排名: 10万+
    最新评论