State模式定义:

允许一个对象在状态改变是,改变它的行为。看起来对象似乎修改了它的类。

模式理解(个人):

State模式主要解决的事在开发中时常遇到的根据不同状态需要进行不同的处理操作的问题,而这样的问题,大部分人会采用switch-case语句进行处理,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译。State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候,进行处理然后在切换到另一种状态。也就是说,把状态的切换责任交给了具体的状态类去负责。同时,State模式和Strategy模式有很多相似的地方,两者的思想应该是一致的,只不过封装的东西不同。State模式封装的事不同的状态,而Strategy模式封装的事不同的算法。

State模式的结构图如下:

如何使用?

1、定义一个State接口,接口中有一个统一的方法,用来封装一个特定状态所对应的行为。

2、定义具体不同状态类ConcreateState实现State接口。

3、每一个状态都实现Context一个状态所对应的行为。

4、定义一个状态管理器Context。

适用性:

1、一个对象的行为取决于它的状态,并且必须在运行时刻根绝状态改变它的行为。

2、一个对象含有庞大的条件分支语句,这些分支依赖于它的状态。这个状态通常用一个或多个枚举常量表示。通常有多个操作包含这一相同的结构。State模式将每一个分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

优缺点:

优点:避免了为判断状态而产生的巨大的if或case语句,将对象行为交给状态类维护后,对上层程序而言,仅需要维护状态之间的转换规则。

缺点:会导致某些系统有过多的具体状态类。

——部分资料整理于网络

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式之State模式的更多相关文章

  1. C++设计模式之State模式

    这里有两个例子: 1.https://www.cnblogs.com/wanggary/archive/2011/04/21/2024117.html 2.https://www.cnblogs.co ...

  2. [设计模式]State模式

    <Java与模式> 又称状态对象模式.状态模式是对象的行为模式.GOF95 一个对象的行为取决于一个或者多个动态变化的属性,这样的属性叫做状态.这样的对象叫做有状态的对象(stateful ...

  3. 设计模式:state模式

    核心: 把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化 例子: class State //状态接口 { public: virtual void show() = 0; ...

  4. 设计模式之 -- 状态模式(State)

     状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.当控制一个对象的状态转换条件分支语句(if...else或switch...case)过于复杂时,可以此模式将状态的判断逻辑 ...

  5. 【转】设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  6. [设计模式] 20 状态模式 State Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对 ...

  7. 设计模式 ( 十七) 状态模式State(对象行为型)

    设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...

  8. 乐在其中设计模式(C#) - 状态模式(State Pattern)

    原文:乐在其中设计模式(C#) - 状态模式(State Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允 ...

  9. 设计模式 State模式 机器的情况下用自己的主动性

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模型给我眼前一亮的感觉啊,值得学习~ 看看定义:改变一个对象的 ...

随机推荐

  1. 【比赛】洛谷夏令营NOIP模拟赛

    Day1 第一题 水题 第二题 题意:一个n*m的字符矩阵从左上到右下,经过字符形成回文串的路径数.n≤500 回文串,考虑两段往中间DP. f[k][x][y]表示走了k步,左上点横坐标为x,右下点 ...

  2. Kill windows和linux 进程

    Windows

  3. 【转】使用SQL语句创建和删除约束

    转自http://blog.csdn.net/hamber_bao/article/details/6504905 约束的目的就是确保表中的数据的完整性. 常用的约束类型如下: 主键约束:(Prima ...

  4. nmap导出处理脚本

    import sys log = open("result.gnmap","r") xls = open("output.csv",&quo ...

  5. 动态替换Linux核心函数的原理和实现

    转载:https://www.ibm.com/developerworks/cn/linux/l-knldebug/ 动态替换Linux核心函数的原理和实现 在调试Linux核心模块时,有时需要能够实 ...

  6. 64_f2

    flxmlrpc-0.1.4-5.fc26.x86_64.rpm 22-May-2017 21:32 57950 flxmlrpc-devel-0.1.4-5.fc26.i686.rpm 22-May ...

  7. mongodb-linux-x86_64

    卷 DataDisk 的文件夹 PATH 列表卷序列号为 4A8E-D95CD:.│  1.txt│  GNU-AGPL-3.0│  MPL-2│  README│  THIRD-PARTY-NOTI ...

  8. linux运维记

    nmap 127.0.0.1 命令查看当前服务器对外有多少端口,用于检查漏洞 vim ctrl+z ,jobs,fg 切换控制应用程序 vim 执行命令 #!sh aa.sh执行命令 运维系统监控开源 ...

  9. 【bzoj1024】生日蛋糕

    一开始想dp 后来发现既然要均等,又看了下数据条件 暴力就能做. #include<bits/stdc++.h> using namespace std; ; int x,y,n; dou ...

  10. Cause: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.ibatis.mapping.MappedStatement

    我用的是pagehelper 4.2.0,利用其进行表单的分页处理并进行展示,在第一次执行的时候能够看到分页后的结果,刷新一下第二次就显示不出来,控制台出现: Cause: java.lang.Cla ...