Java设计模式——状态模式(State)

1979年在湖北出土的曾侯乙编钟,每一只钟都能发出不同的音。

用面向对象的语言来讲,编钟有能够动态变化的属性,也就是它所能发出的声音。编钟的这种属性叫做状态,而编钟被叫做有状态的对象。编钟所能发出的声音是由敲击的那一只钟决定,而钟的数目个每一只钟的状态是事先确定的。

很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的对象。

状态模式的类图如下:

状态模式设计的角色有:

抽象状态角色(State):定义一个接口,用以封装环境对象的一个特定的状态所对应的行为

具体状态角色(ConcreteState):每一个具体状态类都实现了环境的一个状态所对应的行为。

环境角色(Context):定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。

从上图可以看出,环境类Context是所考察的类,而他的行为sampleOperation()是委派给类型为State的一个对象的。由于State本身是一个抽象类或接口,实际担当此任务的是具体的状态类,即:ConcreteState。上图只给出了一个具体的状态类,而实际情况中会有很多具体状态类。换言之,环境类Context的行为SampleOperation()是委派给某一个具体状态类的。

通过使用多态性原则,可以动态的改变环境类Context的属性State的内容,使其从从指向一个具体状态类变换到指向另一个具体的状态类,从而使环境类的行为sampleOperation()由不同的具体状态来执行。

环境角色的源码:

public class Context {
    private State state;

    public void sampleOperation(){
        state.sampleOperation();
    }

    public void setState(State state){
        this.state = state;
    }
} 

抽象状态接口:
public interface State {
    public void sampleOperation();
}
具体状态类:
public class ConcreteState implements State {
    public void sampleOperation() {
        // do something
    }
} 

什么情况下使用状态模式

1、一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变

2、对象在某一个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响到系统的其他部分。

时间: 2024-10-28 06:46:29

Java设计模式——状态模式(State)的相关文章

设计模式 - 状态模式(state pattern) 详解

状态模式(state pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式(state pattern): 允许对象在内部状态改变时改变它的行为, 对象看起来好像修改了它的类. 建立Context类, 包含多个具体状态(concrete state)类的组合, 根据状态的不同调用具体的方法, state.handle(), 包含set\get方法改变状态. 状态接口(state interface), 包含抽象方法handle(),

设计模式 - 状态模式(state pattern) 未使用状态模式 详解

状态模式(state pattern) 未使用状态模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 状态模式可以控制状态的转换, 未使用设计模式时, 程序会非常繁杂. 具体方法: 1. 状态转换类. /** * @time 2014年7月11日 */ package state; /** * @author C.L.Wang * */ public class GumballMachine { final static int SOLD_OUT =

JAVA 设计模式 状态模式

用途 状态模式 (State) 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式是一种行为型模式. 结构 图-状态模式结构图 State : 定义一个接口以封装与 Context 的一个特定状态相关的行为. abstract class State {    public abstract void Handle(Context context);} ConcreteState : 每一个子类实现一个与 Context 的一个状态相关的行为. class Con

java设计模式----状态模式

状态模式: 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 要点: 1.状态模式允许一个对象基于内部状态而拥有不同的行为 2.和程序状态机(PSM)不同,状态模式用类代表状态 3.Context会将行为委托给当前状态对象 4.通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了 5.状态模式和策略模式有相同的类图,但是它们的意思不同 6.策略模式通常会用行为或算法来配置Context类 7.状态模式允许Context随着状态的改变而改变行为 8.状态改变可以由Sta

JAVA设计模式十二--State(状态模式)

状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化.意图:允许一个对象在其内部状态改变时改变它的行为适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分支结

设计模式(java)--状态模式

状态模式(State Pattern)是设计模式的一种,属于行为模式. 定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 意图:允许一个对象在其内部状态改变时改变它的行为 适用场景: 1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为. 2.一个操作中含有庞大的多分

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

深入浅出设计模式——状态模式(State Pattern)

模式动机 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的 (stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的对象与外部事件产生互动时,其内部状态就会改变,从而使得系统的行为也随之发生变化.在UML中可以使用状态图来描述对象状态的变化. 模式定义状态模式(State Pattern) :允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类.其别名为状态对象(Objects for Stat

设计模式 状态模式 以自动售货机为例

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/26350617 状态模式给了我眼前一亮的感觉啊,值得学习~ 先看定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的. 下面使用个例子来说明状态模式的用法,现在有个自动售货机的代码需要我们来写,状态图如下: 分析一个这个状态图: a.包含4个状态(