设计模式之状态模式

State Pattern 是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,使对象看起来像是修改了它的类。

核心概念

状态模式的核心思想是将对象的状态封装成独立的类,并将行为委托给当前状态对象。

主要角色

  1. Context(上下文):维护一个具体状态的实例,定义客户感兴趣的接口

  2. State(状态接口):定义一个接口以封装与Context的特定状态相关的行为

  3. ConcreteState(具体状态):实现状态接口,每个子类实现一个与Context状态相关的行为

定义一个状态接口

// 状态接口
public interface State {
    void handle(Context context);
}

接着定义三个实现状态接口的类

// 具体状态 - 空闲状态
public class IdleState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前是空闲状态,可以开始工作");
        context.setState(new WorkingState());
    }
}



// 具体状态 - 休息状态
public class RestingState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前是休息状态,可以回到空闲状态了");
        context.setState(new IdleState());
    }
}


// 具体状态 - 工作状态
public class WorkingState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前是工作状态,可以休息了");
        context.setState(new RestingState());
    }
}

最后定义一个上下文信息的类


// 上下文类
public class Context {
    private State state;

    public Context() {
        // 初始状态设为空闲状态
        this.state = new IdleState();
    }

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

    public void request() {
        // 委托给当前状态处理
        state.handle(this);
    }
}

编写test类

package com.zsy.State;

public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context();

        // 状态变化演示
        context.request(); // 空闲 -> 工作
        context.request(); // 工作 -> 休息
        context.request(); // 休息 -> 空闲
        context.request(); // 空闲 -> 工作
    }
}

输出

设计模式之状态模式_第1张图片

适用场景

  1. 对象的行为取决于它的状态,并且必须在运行时根据状态改变其行为

  2. 操作中包含大量与对象状态有关的条件语句

  3. 当状态转换逻辑复杂时,或者状态数量较多时

状态模式与策略模式的区别

特性 状态模式 策略模式
目的 处理对象内部状态变化 封装可互换的算法族
状态知晓 状态知道其他状态的存在 策略通常不知道其他策略
转换控制 可由状态类或上下文类控制 通常由客户端控制
状态数量 状态数量通常较多 策略数量通常较少

实际应用案例

  1. 工作流引擎中的状态管理

  2. 游戏开发中角色状态管理

  3. 订单处理系统中的订单状态管理

  4. 网络协议实现中的连接状态管理

你可能感兴趣的:(设计模式,状态模式,java)