码迷,mamicode.com
首页 > 编程语言 > 详细

设计模式--状态模式C++实现

时间:2016-04-09 00:25:47      阅读:217      评论:0      收藏:0      [点我收藏+]

标签:

1定义

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

2类图

技术分享

角色分析

State抽象状态角色,接口或者抽象类,负责状态定义,并且封装环境角色以实现状态切换

ConcreteState具体状态角色,完成两个职责:本状态行为管理以及趋向状态处理--==本状态要做的事和本状态如何过度到其他状态

Context环境角色,定义客户端需要的接口,并且负责具体状态的切换

实现

#include<iostream>
using namespace std;

//前项声明
class Context;
//抽象状态类定义
class State
{
protected:
    State(){}
public:
    virtual~State() = 0
    {};
    void setContext(Context *x)
    {
        _context = x;
    }
    virtual void handler1() = 0;
    virtual void handler2() = 0;
private:
    Context *_context;
};

//具体状态定义
class ConcreteState1 :public State
{
public:
    ConcreteState1(){}
    ~ConcreteState1(){}

    void handler1()
    {
        cout << "ConcreteState1::handler1" << endl;
    }
    void handler2()
    {
        cout << "ConcreteState1::handler2" << endl;
    }
private:

};

//具体状态定义
class ConcreteState2 :public State
{
public:
    ConcreteState2(){}
    ~ConcreteState2(){}

    void handler1()
    {
        cout << "ConcreteState2::handler1" << endl;
    }
    void handler2()
    {
        cout << "ConcreteState2::handler2" << endl;
    }
private:

};

//环境类
class Context
{
public:
    Context()
    :Sta1(new ConcreteState1)
    ,Sta2(new ConcreteState2)
    {}
    State* getCurrentState()
    {
        return CurrentState;
    }
    void SetCurrentState(State* s)
    {
        CurrentState = s;
        CurrentState->setContext(this);
    }
    void handler1()
    {
        CurrentState->handler1();
    }
    void handler2()
    {
        CurrentState->handler2();
    }
    ~Context(){}
private:
    //当前状态则是所有状态中的一种
    State *CurrentState;
    //所有状态应当定义为static比较合适
    State *Sta1;
    State *Sta2;
};

 3应用

①优点

状态模式隐藏了状态的 变化过程,他的切换引起了行为的变化。我们只看到行为变化,而没有状态变化

结构清晰,避免过多switch或者if语句的使用

体现开闭原则和单一职责原则,每个状态都是一个子类

封装性良好,状态变化在内部体现,外界调用不知道这一点

②缺点

子类越多会带来类膨胀的问题 

4使用场景

行为随着状态改变而改变

条件分之判断语句的替代者

5注意事项

状态模式适用于当某个对象在他的状态发生变化时,他的行为也随之变化,也就是行为受状态约束的情况下使用状态模式,而且使用对象时状态不超过5个

6最佳实践

TCP三个状态切换:等待状态,连接状态,断开状态。

工作流开发:状态机管理。

设计模式--状态模式C++实现

标签:

原文地址:http://www.cnblogs.com/lang5230/p/5370424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!