美文网首页C++设计模式
【C++设计模式】 状态模式

【C++设计模式】 状态模式

作者: 小鱼号的代码日记 | 来源:发表于2021-03-07 18:37 被阅读0次
/* 小鱼号的代码日志
 * 设计模式
 * 状态模式
 * 解决对象在多种状态转换时,需要对外输出不同的行为的问题。
 * 状态和行为时一一对应的
 * 当一个对象内在状态改变时,允许改变其行为.
 * 这个对象看起来像是改变了其类
 * 现实实例:
 * 抽奖的几种状态
 * 不能抽奖状态(需要先扣积分)
 * 可以抽奖(扣除了积分)
 * 领取奖品
 * 奖品领完了(活动结束)
 */

#include<iostream>
#include<list>
#include<map>
#include<stdlib.h>
#include "stateactivity.h"
using namespace std;

class Activity;
///抽奖状态抽象类
class State
{
public:
    State(Activity* act)
    {
        m_act = act;
    }
public:
    //扣除积分
    virtual void dedcutMoney() = 0;
    //是否抽中奖品
    virtual bool raffle() = 0;
    //发放奖品
    virtual void dispensePrize() = 0;
protected:
    Activity* m_act;
};


///不能抽奖的状态
class NoRaffleState : public State
{
public:
     NoRaffleState(Activity* act):State(act)
     {

     }
public:
    //扣除积分 将状态设置成可抽奖状态
    void dedcutMoney()
    {
        cout << "dedcut 50 and can raffle" << endl;
        m_act->setState(m_act->getCanRaffleState());
    }
    //是否抽中奖品 当前状态不能抽奖
    bool raffle()
    {
        cout << "can not raffle please dedcut first" << endl;
    }
    //发放奖品 前状态发放奖品
    void dispensePrize()
    {
        cout << "can not dispecse prize" << endl;
    }
};

///可以抽奖的状态
class CanRaffleState : public State
{
public:
     CanRaffleState(Activity* act):State(act)
     {

     }
public:
    //扣除积分
    void dedcutMoney()
    {
        cout << "dedcut 50 already" << endl;
    }

    //是否抽中奖品
    bool raffle()
    {
        cout << "hold on raffle" << endl;
        int a = rand() % 10;
        if(a %2 == 0)
        {
            m_act->setState(m_act->getDispenseRaffleState());
            cout << "congratulate" << endl;
            return true;
        }
        else
        {
            m_act->setState(m_act->getNoRaffleState());
            cout << "sorry" << endl;
            return false;
        }
    }

    //发放奖品
    void dispensePrize()
    {
        cout << "can not dispecse prize" << endl;
    }
};

///发放奖品的状态
class DispenseRaffleState : public State
{
public:
     DispenseRaffleState(Activity* act):State(act)
     {

     }
public:
    //扣除积分
    void dedcutMoney()
    {
        cout << "dedcut 50 already" << endl;
    }

    //是否抽中奖品
    bool raffle()
    {
        cout << "raffle already" << endl;
        return false;
    }

    //发放奖品
    void dispensePrize()
    {
        if(m_act->getPrizeCount() > 0)
        {
            m_act->setState(m_act->getNoRaffleState());
            cout << "take your prize" << endl;
        }
        else
        {
            m_act->setState(m_act->getRaffleOutState());
            cout << "sorry the prize is out" << endl;
        }
    }
};

///奖品发完了的状态 活动已经结束
class RaffleOutState : public State
{
public:
     RaffleOutState(Activity* act):State(act)
     {

     }
public:
    //扣除积分
    void dedcutMoney()
    {
        cout << "sorry prize already out activirt is over" << endl;
    }

    //是否抽中奖品
    bool raffle()
    {
        cout << "sorry prize already out activirt is over" << endl;
        return false;
    }

    //发放奖品
    void dispensePrize()
    {
        cout << "sorry prize already out activirt is over" << endl;
    }
};

#ifndef STATEACTIVITY_H
#define STATEACTIVITY_H

class State;
class Activity
{
public:
    Activity(int count);
public:
    //扣除积分
    void dedcutMoney();
    //是否抽中奖品
    bool raffle();
    //发放奖品
    void dispensePrize();
    State* getNoRaffleState();
    State* getCanRaffleState();
    State* getDispenseRaffleState();
    State* getRaffleOutState();
    State* setState(State* state);
    int getPrizeCount();
private:
    int m_prizeCount;
    State* m_currentState;
    State* m_noRaffleState;
    State* m_canRaffleState;
    State* m_dispenseRaffleState;
    State* m_raffleOutState;
};
#endif // STATEACTIVITY_H
#include "state.cpp"
///含所有的状态对象
///各个状态子类也含有Activity对象

Activity::Activity(int count)
{
    m_prizeCount = count;
    m_noRaffleState = new NoRaffleState(this);
    m_canRaffleState = new CanRaffleState(this);
    m_dispenseRaffleState = new DispenseRaffleState(this);
    m_raffleOutState = new RaffleOutState(this);
    m_currentState = getNoRaffleState();
}

void Activity::dedcutMoney()
{
    m_currentState->dedcutMoney();
}

//是否抽中奖品
bool Activity::raffle()
{
    if(m_currentState->raffle())
    {
        m_currentState->dispensePrize();
    }
}

//发放奖品
void Activity::dispensePrize()
{
    m_currentState->dispensePrize();
}

State* Activity::getNoRaffleState()
{
    return m_noRaffleState;
}

State* Activity::getCanRaffleState()
{
    return m_canRaffleState;
}

State* Activity::getDispenseRaffleState()
{
    return m_dispenseRaffleState;
}

State* Activity::getRaffleOutState()
{
    return m_raffleOutState;
}

State* Activity::setState(State* state)
{
    m_currentState = state;
}

int Activity::getPrizeCount()
{
    cout << "current prize count:" << m_prizeCount << endl;
    return m_prizeCount--;
}

///状态模式
void testState()
{
    cout << "state patterns" << endl;
    Activity act(5);
    for(int i = 0; i < 20; i++)
    {
        act.dedcutMoney();
        act.raffle();
    }
}



相关文章

  • 【C++设计模式】 状态模式

  • C++设计模式-第三篇 (Boolan)

    C++设计模式-第三篇 (Boolan) 本章内容:1 备忘录模式2 状态模式3 组合模式4 迭代器模式5 职责模...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • C++常用设计模式

    C++常用设计模式。

  • C++ 设计模式 —— 20.状态模式

    状态模式:一种行为型设计模式 应用场景:状态模式主要应用于对象有很多状态,每种状态下有不同的表现,而且在程序运行过...

  • 设计模式——状态模式

    设计模式——状态模式 在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 优点: 减少...

  • C++ 中的设计模式

    对于任何一种语言都有自己的设计模式,C++也不例外,详情请见:C++ 中的各种设计模式

  • 设计模式-状态设计模式

    1.定义 对于某个操作,由于其状态的不同,表现出的行为会不同(如遥控器进行音量增加的操作,在电视是开机状态下是可以...

  • 设计模式——状态模式

    前言 设计模式是指导一个程序猿以更好的姿态处理一些问题,而不再像刚学编程的我们,只会使用if-else分支语句,或...

  • 设计模式--状态模式

    基本常识:策略模式与状态模式是双胞胎,在出生时才分开。 假设公司有个糖果机,1当糖果机由糖果,投入25分钱,转动曲...

网友评论

    本文标题:【C++设计模式】 状态模式

    本文链接:https://www.haomeiwen.com/subject/gfpyqltx.html