美文网首页Java设计模式
设计模式——状态模式

设计模式——状态模式

作者: Ant_way | 来源:发表于2018-06-12 16:59 被阅读0次

在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像是改变了它的类一样。

状态模式原理
状态模式的核心思想是把研究对象的行为包装在不同的状态对象里,每个状态对象都抽取出一个抽象状态类的子类。状态模式的意图是将一个对象内部状态的变化体现在对应的行为上随之变化。

状态模式的角色

  • Context(上下文角色):通过包含一个具体状态类的实例引用,然后定义客户所需的接口响应不同状态下的行为,该状态类实例指明了当前环境对象的现有状态。
  • IState(抽象状态角色):定义一个接口,用来封装对象内部状态的行为。
  • ConcreteState(具体状态角色):每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

UML图

StatePattern.png

实例演示
在一个语音的模块中,模块有四个状态:空闲状态、初始化状态、录音状态、结果处理状态。这里我们就可以采用状态模式进行设计。

定义State接口和对应的状态实现

/**
 * 定义State状态接口,声明具体的操作
 * @author Iflytek_dsw
 *
 */
public interface ISpeechState {
    /**
     * 具体状态下的操作
     */
    public void doAction();
}

/**
 * 空闲状态
 * @author Iflytek_dsw
 *
 */
class SpeechIdleState implements ISpeechState{

    @Override
    public void doAction() {
        System.out.println("现在是空闲状态");
    }
}

/**
 * 初始化状态
 * @author Iflytek_dsw
 *
 */
class SpeechInitState implements ISpeechState{

    @Override
    public void doAction() {
        System.out.print("现在是初始化状态");
    }
}

/**
 * 录音状态
 * @author Iflytek_dsw
 *
 */
class SpeechRecordingState implements ISpeechState{

    @Override
    public void doAction() {
        System.out.println("现在是录音状态");
    }
}

/**
 * 结果状态
 * @author Iflytek_dsw
 *
 */
class SpeechResultState implements ISpeechState{

    @Override
    public void doAction() {
        System.out.println("现在是结果状态");
    }
}

定义环境控制类Context

public class SpeechStateManager {
    private ISpeechState currentSpeechState;
    private SpeechStateManager instance = new SpeechStateManager();
    
    public SpeechStateManager getInstance(){
        return instance;
    }
    
    /**
     * 空闲状态
     */
    public void idleDoAction(){
        setCurrentSpeechState(new SpeechIdleState());
        currentSpeechState.doAction();
    }
    
    public void initDoAction(){
        setCurrentSpeechState(new SpeechInitState());
        currentSpeechState.doAction();
    }


    private void setCurrentSpeechState(ISpeechState currentSpeechState) {
        this.currentSpeechState = currentSpeechState;
    }
}

客户端调用

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        SpeechStateManager manager = new SpeechStateManager();
        manager.idleDoAction();
        manager.initDoAction();
    }
}

状态模式总结

  • 优点

    1. 状态模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
    2. 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换。
    3. 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。
  • 缺点

    • 导致较多的ConcreteState子类
  • 适用场景

    1. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式来。
    2. 一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态。

相关文章

  • 设计模式-状态模式

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

  • 设计模式——状态模式

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

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

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

  • 设计模式——状态模式

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

  • 设计模式--状态模式

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

  • 设计模式——状态模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:状态模式,又称状态对象模式(Patte...

  • 设计模式《状态模式》

    引言   上一节我们说了策略模式。这一节我们讲讲策略模式的双胞胎弟弟:状态模式,这个模式大家可能不常见,也不常用,...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 设计模式 - 状态模式

    模式定义 允许一个对象在其内部状态发生改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式(State Pa...

  • 设计模式 ——— 状态模式

    STATE(状态) ———— 对象行为型模式 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改...

网友评论

    本文标题:设计模式——状态模式

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