设计模式之状态模式(State )
状态模式是根据其状态变化来改变对象的行为,允许对象根据内部状态来实现不同的行为。内容类可以具有大量的内部状态,每当调用实现时,就委托给状态类进行处理。
作用
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
类视图

实现
class State;
class LowState; //低等折扣
class MediaState; //中等折扣
class HighState; //高等折扣
//折扣
class Discount
{
public:
Discount(State* sta):m_state(sta){}
~Discount(){delete State;}
void request(){ m_state->handle(this);}
void setstate(State* sta)
{
delete m_state;
m_state = sta;
}
int GetBuyNum(){return m_nBuyNum;}
void SetBuyNum(int nNum){m_nBuyNum =nNum; }
private:
State* m_state;
int m_nBuyNum;
};
//运行系统
class State
{
public:
virtual void handle(Discount*)=0;
};
class LowState : public State
{
public:
LowState();
~ LowState();
void handle(Discount* pDis)
{
if (pDis)
{
int nNum = pDis->GetBuyNum();
if (nNum<=10)
{
cout<< "打9折";
}
else
{
pDis->setstate(new MediaState());
pDis->request();
}
}
}
};
class MediaState : public State
{
public:
MediaState();
~ MediaState();
void handle(Discount* pDis)
{
if (pDis)
{
int nNum = pDis->GetBuyNum();
if(nNum<=10)
{
pDis->setstate(new LowState());
pDis->getstate();
}
else if (nNum>10 && nNum <=50)
{
cout<< "打7折";
}
else
{
pDis->setstate(new HighState());
pDis->request();
}
}
}
};
class HighState : public State
{
public:
void handle(Discount* pDis)
{
if (pDis)
{
int nNum = pDis->GetBuyNum();
if (nNum>50)
{
cout<< "打5折";
}
else
{
pDis->setstate(new MediaState());
pDis->request();
}
}
}
};
int main()
{
Discount disc(new LowState());
disc.SetBuyNum(40);
disc.request();
}
状态模式里可以看到策略模式和责任链模式的影子,从结构和功能上会有些相似;
策略模式和状态模式最为相像,其二者主要区别是策略模式更关心的是strategy的类型多态实现,一般会在外部调用时进行指明;而状态模式不会直接决定State的具体实现,而是通过内部状态参数来决定。
责任链模式由前后的链条关系,在创建时需要明确指出,而状态模式是由状态选择其多态的实现。
所以状态模式之所以单独独立出来,就是为了凸显在不同状态下的不同实现。
这篇电梯的实现很形象,大家可以参考电梯应用
应用场景
- 一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
- 一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。
设计模式之状态模式(State )的更多相关文章
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...
- 北风设计模式课程---状态模式State(对象行为型)
北风设计模式课程---状态模式State(对象行为型) 一.总结 一句话总结: 状态模式 具体状态的行为在具体的状态类中就解决,不用交给外部做判断.实质是将多条件判断弄成了多个类,在不同的类中做判断 ...
- 二十四种设计模式:状态模式(State Pattern)
状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...
- 设计模式2——状态模式State
参考链接: 设计模式之状态模式:https://www.cnblogs.com/haoerlv/p/7777789.html 设计模式系列之状态模式:https://www.jianshu.com/p ...
- 设计模式之 -- 状态模式(State)
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...
- [设计模式] 20 状态模式 State Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...
- 设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 大熊君说说JS与设计模式之------状态模式State
一,总体概要 1,笔者浅谈 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式主要解决的是当控制一个对象状态的条件表达式过于 ...
随机推荐
- 1.2万事开头hello world+交互+getpass、sys模块初识
1.python的hello world: ①运行cmd-输入python-输入print (“hello world!”) ②创造.py的文本helloworld.py(后缀是为了告诉其他人)-输入 ...
- python之os库
python之os库 os.name 判断现在正在实用的平台,Windows 返回 'nt'; Linux 返回'posix' >>> os.name 'nt' os.getcwd( ...
- python 引入本地 module
数据校验时,需要引入本地的一个告警python代码,引入的方式如下: import sys import os # 引入本地文件目录,或和需要引入的python文件放在同一个文件夹下 sys.path ...
- yum-内网yum源服务器配置(CentOS6.5)
一.安装apache服务1.安装httpd服务 yum -y install httpd (纯内网用rpm包安装也可以) 2.启动httpd服务 service httpd start 二.挂载完整的 ...
- Latex 模版生成会议论文 不显示Keywords,而是显示 Index Terms- ,改成Keywords 方法
一. 不管显示何种内容,TEX 文件都是 \begin{IEEEKeywords} 关键词1.关键词2,..... \end{IEEEKeywords} 其中:模版文件 IEEETran.cls存在下 ...
- Mapreduce atop Apache Phoenix (ScanPlan 初探)
利用Mapreduce/hive查询Phoenix数据时如何划分partition? PhoenixInputFormat的源码一看便知: public List<InputSplit> ...
- JVM活学活用——调优工具
概述 工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相 ...
- Django 通过 mongoengine 连接 MongoDB 进而使用orm进行CRUD
一. 在python脚本中, 我们通常可以使用pymongo模块实现与mongodb数据库的交互, 但是在使用Django框架进行定制开发的web server 项目中, 仍然使用pymongo模块的 ...
- [git] 常用配置
基本配置 对git进行配置时使用 git config 命令进行操作 1. git config 的作用域,缺省等于 local git config --local #只针对某个仓库有效 git ...
- SQL 的单引号转义字符
SQL 的转义字符是:'(单引号) 例:select * from user where name = '''06' 其中红色的单引号即表示转义字符,上例中 name的实际条件值为 '06,而不是 ' ...