【设计模式】状态模式 改进后的

1、简单谈谈

状态模式

当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。

状态模式要解决的问题是:当控制一个对象状态转换的条件表达式过于复杂时的情况,
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。

优点:简化了一个对象的状态转换和行为改变的代码,把这部分代码放在了【状态类】
中,需要注意的一点是:在【状态类】中,每个不同的【状态值】也许会被“串起来”
成为一条链,这样就能保证设置不同的“离散的”【状态值】时,可以在“链上”有
有个对应的处理(行为)。

缺点:在【状态类】在要引用【客户类】,而在【客户类】中也要用到【状态类】,
两个类要互相引用。 耦合度稍高。

2、代码为例

//状态抽象基类
class CState
{
public:
    CState();
    virtual ~CState();
    virtual void Show(CMe* pMe) = 0;
};

CState::CState(){}
CState::~CState(){}

//单身状态类
class CSingle : public CState
{
public:
    CSingle();
    virtual ~CSingle();
    virtual void Show(CMe* pMe);
};

CSingle::CSingle(){}
CSingle::~CSingle(){}
void CSingle::Show(CMe* pMe)
{
    if(NULL == pMe) return;
    int nAge = pMe->GetAge();

    //if .. else 把状态串成了一条链,得以让每个状态都有一个对应的处理。
    if(nAge < 18)
    {
        cout << endl << "哥哥今年才 " << nAge << " 岁啊,还不能找女朋友啊啊 单身啊!! " <<endl;
    }
    else
    {
        pMe->SetState(new CWithGirl());
        pMe->ShowMsg();
    }

}

//有女朋友状态类
class CWithGirl : public CState
{
public:
    CWithGirl();
    virtual ~CWithGirl();
    virtual void Show(CMe* pMe) ;
};

CWithGirl::CWithGirl(){}
CWithGirl::~CWithGirl(){}
void CWithGirl::Show(CMe* pMe)
{
    if(NULL == pMe) return;
    int nAge = pMe->GetAge();
    if(nAge >= 18)
    {
        cout << endl << "哥哥今年已经 " << nAge << " 岁了啊 哈哈 ,可以有女朋友了啊啊 哈哈哈!!" << endl;
    }
}

//我 类
class CMe
{
public:
    CMe();
    virtual ~CMe();
    void SetState(CState* pState);  //设置状态
    void ShowMsg();                    //显示此状态的信息, 供
    int GetAge() const;                //获取年龄
    void SetAge(int nAge);            //设置年龄

protected:
    CState* m_ptrState;             //状态
    int m_nAge;                        //年龄
};

CMe::CMe() : m_ptrState(NULL), m_nAge(0){}
CMe::~CMe(){}
void CMe::SetState(CState* pState)  //状态的改变放在State类中
{
    m_ptrState = pState;
}
void CMe::ShowMsg()                 //不同状态对应的不同行为 表现在 State类中的Show函数
{
    m_ptrState->Show(this);
}
int CMe::GetAge() const {return m_nAge;}
void CMe::SetAge(int nAge) {this->m_nAge = nAge;}

客户端

int _tmain(int argc, _TCHAR* argv[])
{
    //对客户来说,只需要设置CMe类的不同年龄,而每个年龄(状态)对应
    //的行为并不在CMe类中实现,而是在State类中实现
    CMe me1;
    me1.SetAge(16);
    me1.ShowMsg();

    cout << endl << endl;

    me1.SetAge(20);  //16变为20,相当于状态的改变
    me1.ShowMsg();   //同样的一个ShowMsg方法,在不同状态的时候其行为也不一样

    cout << endl << endl;

    return 0;
}

3、补充说明

有一个待解决的问题,就是两个类的相互引用,关键是先出现的类中引用了后出现类中的函数,这是问题,所以,这篇,没有执行结果截图

【设计模式】状态模式 改进后的

时间: 2024-10-07 09:20:03

【设计模式】状态模式 改进后的的相关文章

设计模式 —— 状态模式(State Pattern)

状态模式(State Pattern) 概念:状态模式 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类 在软件设计中,我们经常会遇需要编写有很多状态的程序.最简单的如乘坐电梯程序,当我们要坐电梯时需要判断电梯的状态,只有当电梯处于当前楼时我们才能乘坐,当电梯不在当前楼层时我们要按下按钮等待电梯到来.在平时一般都通过 if-else 或者 switch 判断状态后处理,这种固定的写法只有在软件后期不会更新时才可以(不过是不可能的),状态模式其实是使用组合通过简单引用不同的状态 对

14. 星际争霸之php设计模式--状态模式

题记==============================================================================本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦! 本文地址:http://www.cnblogs.com/davidhhuan/p/4248198.html============================================

设计模式 状态模式 以自动售货机为例

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的. 下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下: 分析一个这个状态图: a.包含4个状态(

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),

【C#设计模式-状态模式】

一.状态模式的定义:状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 二.状态模式的意图:允许一个对象在其内部状态改变时改变它的行为. 三.状态模式的适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态. 四.状态模式的实现: /// <summary> /// 定义接口,封装Context对象在特定

设计模式—状态模式

转载自CSDN:http://blog.csdn.net/hguisu/article/details/7557252,以便查阅,非原创 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改

设计模式-状态模式(State Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态,在当前状态发生变化是,这个对象执行和之前相同的操作也会有不同的作用效果. 状态模式的定义和基本结构 定义:状态模式允许一个对象在其内部状态改变的时候改变它的行为,就像变成了另一个对象一样. 一张来自<Head First>的结构图 Context:这个类里面包含了很多种状态类,当前状态不同时,这个

Android中的设计模式-状态模式

状态模式说明 "状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样." –<JAVA与模式> 管理者持有多种状态,状态切换后,管理者调用Handle方法时,间接调用状态类中的Handle方法,从而根据当前状态的不同,就可以表现出不同的结果. 状态模式类图 状态模式使用示例 例如一个变形金刚,假设它有3中状态:汽车状态,人形状态,飞机状态. 不同的状态进行战斗的时候,采用的方式不同,分别是"撞击碾压","赤