状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

这个模式将状态封装成为独立的类,并将动作委托到代表当前对象的对象,这样行为就与拥有状态类解耦了。

从客户的角度来看,对象的行为被完全改变,好像对象是从别的类实例化而来,但实际上我们是使用组合通过简单引用不同的状态对象来造成类改变的假象。

类图:

看到状态模式的类图,如果对策略模式熟悉的人,会发现两者的类图根本是一模一样的。

两个模式的差别在于它们的“意图”。

对状态模式来说,将一群行为封装在状态对象中,context的行为随时可委托给状态对象的人任何一个,当前状态在状态对象中游走改变,以反映Context的内部状态,Context的客户对状态对象不了解,仅有一个State接口的引用,不知道运行时具体是哪个状态类的行为。这样在Context内部不需要放置许多条件判断当前是哪种状态以决定行为这种不优雅的实现。

对策略模式来说,客户通常主动指定Context所要组合的策略对象是哪一个,一般不会轻易修改策略,策略模式只是让我们的设计更具弹性,能够在运行时改变策略,一般来说,策略模式可以想成是继承之外的一种弹性替代方案,如果使用继承来定义一个类的行为,就被这个行为困住,当行为改变时,必然要修改原有的代码,有了策略模式,可以通过组合不同的对象来改变行为,而不需要更改已经写好的代码。

下面举个例子:一个游戏有两个状态start和stop

interface State {
public abstract void handle();
} public class StartState implements State {
  public void handle() {
    System.out.println("In start state");
  }
} public class StopState implements State {
  public void handle() {
    System.out.println("In stop state");
  }
} public class Context {
  State state;
  public void request() {
    state.handle();
  }
  pubblic void setState(State s){
    state = s;
  }
  public State getState() {
    return state;
  }
} public class Client {
  public static void main(String[] args) {
    Context c = new Context();
    
    StartState s1 = new StartState();
    StopState s2 = new StartState();
    
    c.setState(s1);
    c.request();
    
    c.setState(s2);
    c.request();
  }
}

状态模式(State Pattern)的更多相关文章

  1. 二十四种设计模式:状态模式(State Pattern)

    状态模式(State Pattern) 介绍允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例有一个Message实体类,对它的操作有Insert()和Get()方法, ...

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

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

  3. 状态模式-State Pattern(Java实现)

    状态模式-State Pattern 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. State接口 ...

  4. 设计模式(十二):通过ATM取款机来认识“状态模式”(State Pattern)

    说到状态模式,如果你看过之前发布的重构系列的文章中的<代码重构(六):代码重构完整案例>这篇博客的话,那么你应该对“状态模式”并不陌生,因为我们之前使用到了状态模式进行重构.上一篇博客我们 ...

  5. 十一个行为模式之状态模式(State Pattern)

    定义: 当一个对象有多个状态,并且在每个状态下有不同的行为,可以使用状态模式来在其内部改变状态时改变其行为,而客户端不会察觉状态的改变,仍使用同样的方法或接口与对象进行交互. 结构图: Context ...

  6. 【UE4 设计模式】状态模式 State Pattern

    概述 描述 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类. 其别名为状态对象(Objects for States),状态模式是一种对象行为型模式. 有限状态机(FSMs) ...

  7. 状态模式(State Pattern)

    当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂 ...

  8. C#设计模式——状态模式(State Pattern)

    一.概述在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为.如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构 ...

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

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

  10. php状态模式(state pattern)

    ... <?php /* The state pattern encapsulates the varying behavior for the same object based on its ...

随机推荐

  1. Codeforces294B - Shaass and Bookshelf(贪心)

    题目大意 给你N本书,每本书由一个厚度t[i](1或者2),宽度w[i],高度都是一样,把一些书竖着放,然后一些书横着放在同一层,就像下图那样放: 问你把所有的书放好之后竖着的书的总厚度是多少? 题解 ...

  2. windows蓝屏代码大全及常见蓝屏解决方案

    对于以下的代码查询建议使用ctrl+F查询,而且很多蓝屏与黑屏的问题多是最近操作引起的,例如更新驱动,安装新的硬件.软件--把相关的配置调到最近的正常状况大多可以解决,确实不行时方可考虑重装系统,解决 ...

  3. 淘宝HSF服务的原理以及简单的实现

    淘宝HSF服务具体来说分三个应用:api接口,service服务,本地应用. 最基本的Api服务应该是十分干净的,不含方法,只有接口.它是要被打包(jar包的形式)到中央仓库去的. service服务 ...

  4. 浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异

    Underscore.js是一个很精干的库,压缩后只有5.2KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程. 本文仅探讨Underscore.js的两个 ...

  5. tomcat管理web界面

    在/usr/tomcat/apache-tomcat-7.0.47/conf/tomcat-users.xml里 <?xml version='1.0' encoding='utf-8'?> ...

  6. linux中安装easy_install(setuptools)

    假设是相似于ubuntu的带桌面的系统直接下载安装就能够了.下面是针对centOS的命令行安装方法 最好先查看版本号号,依据版本号来选择安装方法.终端命令例如以下 # lsb_release -a 版 ...

  7. 标准I/O库之标准I/O的效率

    程序清单5-1 用getc和putc将标准输入复制到标准输出 #include "apue.h" int main( void ) { int c; while(( c = get ...

  8. 给未来的你——李开复2011级大学新生演讲

    2011年09月26日08:30 来源:<中国青年报> <中国青年报>的读者朋友们: 你们肩负着中华的未来,你们身上正涌动着创新的血脉! 无论你在哪所学校,哪个城市,你都是与众 ...

  9. 谓词(NSPredicate)

    OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤 ...

  10. KALI 2.0优化

    1.首选项没有主菜单,系统管理 apt-get install alacarte 2.APT源 #官方源deb http://http.kali.org/kali kali main non-free ...