美文网首页
状态模式

状态模式

作者: 潜心之力 | 来源:发表于2020-08-14 16:22 被阅读0次

一、模式简介

定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
场景:当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时。当一个操作中含有庞大的分支结构,并且这些分支决定于对象的状态时。

  • 角色结构:
  • 环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
  • 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。
  • 具体状态(Concrete State)角色:实现抽象状态所对应的行为。

二、模式实现

public abstract class AbstractThreadState { -> 抽象状态
    protected String state;
    protected abstract String state();
}

public class NewConcreteThreadState extends AbstractThreadState { -> 具体状态
    public void start(ThreadContext context){
        if("new".equals(context.getState().state())){
            System.out.println("线程处于new状态,切换到runnable状态");
            context.setState(new RunnableConcreteThreadState());
        }else{
            System.out.println("线程不处于new状态,不能调用start方法");
        }
    }

    @Override
    protected String state() {
        super.state = "new";
        return this.state;
    }
}

public class RunnableConcreteThreadState extends AbstractThreadState { -> 具体状态
    @Override
    protected String state() {
        super.state = "runnable";
        return this.state;
    }

    public void cpu(ThreadContext context){
        if("runnable".equals(context.getState().state())){
            System.out.println("线程处于runnable状态,切换到running状态");
            context.setState(new RunningConcreteThreadState());
        }else{
            System.out.println("线程不处于runnable状态,不能调用cpu方法");
        }
    }
}

public class RunningConcreteThreadState extends AbstractThreadState { -> 具体状态
    @Override
    protected String state() {
        super.state = "running";
        return this.state;
    }

    public void suspend(ThreadContext context){
        if("running".equals(context.getState().state())){
            context.setState(new BlockConcreteThreadState());
            System.out.println("线程处于runnable状态,切换到block状态");
        }else{
            System.out.println("线程不处于runnable状态,不能调用suspend方法");
        }
    }

    public void stop(ThreadContext context){
        if("running".equals(context.getState().state())){
            context.setState(new DeadConcreteThreadState());
            System.out.println("线程处于runnable状态,切换到deal状态");
        }else{
            System.out.println("线程不处于runnable状态,不能调用stop方法");
        }
    }
}

public class BlockConcreteThreadState extends AbstractThreadState { -> 具体状态
    @Override
    protected String state() {
        super.state = "block";
        return this.state;
    }

    public void resume(ThreadContext context){
        if("block".equals(context.getState().state())){
            System.out.println("线程处于block状态,切换到runnable状态");
            context.setState(new RunningConcreteThreadState());
        }else{
            System.out.println("线程不处于block状态,不能调用resume方法");
        }
    }
}

public class DeadConcreteThreadState extends AbstractThreadState { -> 具体状态
    @Override
    protected String state() {
        super.state = "deal";
        return this.state;
    }

    public void dead(){
        System.out.println("线程处于deal状态");
    }
}

public class ThreadContext { -> 环境
    private AbstractThreadState state;

    public ThreadContext(AbstractThreadState state) {
        this.state = state;
    }

    public void start() {
        if(state instanceof NewConcreteThreadState){
            ((NewConcreteThreadState) state).start(this);
        }else{
            System.out.println("线程正处于"+state.state()+"状态,无法start");
        }
    }

    public void cpu() {
        if(state instanceof RunnableConcreteThreadState){
            ((RunnableConcreteThreadState) state).cpu(this);
        }else{
            System.out.println("线程正处于"+state.state()+"状态,无法cpu");
        }
    }

    public void stop() {
        if(state instanceof RunningConcreteThreadState){
            ((RunningConcreteThreadState) state).stop(this);
        }else{
            System.out.println("线程正处于"+state.state()+"状态,无法stop");
        }
    }

    public void suspend() {
        if(state instanceof RunningConcreteThreadState){
            ((RunningConcreteThreadState) state).suspend(this);
        }else{
            System.out.println("线程正处于"+state.state()+"状态,无法suspend");
        }
    }

    public void resume() {
        if(state instanceof BlockConcreteThreadState){
            ((BlockConcreteThreadState) state).resume(this);
        }else{
            System.out.println("线程正处于"+state.state()+"状态,无法resume");
        }
    }

    public AbstractThreadState getState() {
        return state;
    }

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

以Java线程状态切换为例子,状态包含new、runnable、running、block、dead,每种状态有各自的行为,当调用者与线程对象产生互动后,线程对象内部的状态随之发生改变,线程对象的行为同时发生改变。

ThreadContext context=new ThreadContext(new NewConcreteThreadState());
context.start();
context.cpu();
context.suspend();
context.resume();
context.cpu();
context.stop();

相关文章

  • State模式

    状态模式(State模式) 定义 状态模式,又称状态对象模式(Pattern of Objects for S...

  • 设计模式-状态模式

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

  • 状态模式(状态机模式)

    状态模式学习笔记 前言:文章从三方面简单阐述状态模式:是什么、为什么、如何做。这是我在工作之余自己的一些理解、思考...

  • C++设计模式(3)

    本文预览: 状态模式 组合模式 迭代器 职责链 命令 状态模式 定义:状态模式(State Pattern),允许...

  • 设计模式——状态模式

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

  • 第5章 -行为型模式-状态模式

    一、状态模式的简介 二、状态模式的优缺点 三、状态模式的实例

  • 状态模式

    Android进阶之设计模式 状态模式 定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了...

  • 状态模式

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

  • 状态模式

    《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代...

  • 状态模式

    状态模式 一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if...else 来控制 示例 交通灯信...

网友评论

      本文标题:状态模式

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