Java设计模式之状态模式

状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。该模式将对象的行为封装在不同的状态类中,使得对象在不同的状态下可以有不同的行为,从而实现了状态的切换和行为的变化。

在状态模式中,一个对象可以有多个状态,每个状态对应一个具体的类,这些状态类共同实现一个抽象状态类或接口。对象在不同状态下的行为由当前状态类决定,对象内部维护一个指向当前状态对象的引用,通过改变状态对象的引用来改变对象的行为。

以下是状态模式的参与者:

  • Context(上下文):定义客户端感兴趣的接口,并维护一个具体状态类的实例,用于处理状态的转换。
  • State(状态):定义一个接口或抽象类,封装与Context相关的行为,并提供具体状态类的接口。
  • ConcreteState(具体状态):实现State接口或继承抽象类,定义与特定状态相关的行为。

下面是一个简单的示例,通过状态模式实现一个电梯的状态管理:

java 复制代码
// State接口
interface ElevatorState {
    void open();
    void close();
    void move();
    void stop();
}

// 具体状态类:开门状态
class OpenState implements ElevatorState {
    public void open() {
        System.out.println("电梯门已经打开");
    }

    public void close() {
        System.out.println("电梯门关闭");
    }

    public void move() {
        System.out.println("电梯开始运行");
    }

    public void stop() {
        System.out.println("电梯停止");
    }
}

// 具体状态类:关门状态
class CloseState implements ElevatorState {
    public void open() {
        System.out.println("电梯门打开");
    }

    public void close() {
        System.out.println("电梯门已经关闭");
    }

    public void move() {
        System.out.println("电梯开始运行");
    }

    public void stop() {
        System.out.println("电梯停止");
    }
}

// 具体状态类:运行状态
class MoveState implements ElevatorState {
    public void open() {
        System.out.println("电梯正在运行,不能打开门");
    }

    public void close() {
        System.out.println("电梯正在运行,不能关闭门");
    }

    public void move() {
        System.out.println("电梯正在运行中");
    }

    public void stop() {
        System.out.println("电梯停止");
    }
}

// 具体状态类:停止状态
class StopState implements ElevatorState {
    public void open() {
        System.out.println("电梯门打开");
    }

    public void close() {
        System.out.println("电梯门关闭");
    }

    public void move() {
        System.out.println("电梯开始运行");
    }

    public void stop() {
        System.out.println("电梯已经停止");
    }
}

// 上下文类:电梯
class Elevator {
    private ElevatorState currentState;

    public Elevator() {
        currentState = new StopState(); // 初始状态为停止状态
    }

    public void setState(ElevatorState state) {
        currentState = state;
    }

    public void open() {
        currentState.open();
        setState(new OpenState());
    }

    public void close() {
        currentState.close();
        setState(new CloseState());
    }

    public void move() {
        currentState.move();
        setState(new MoveState());
    }

    public void stop() {
        currentState.stop();
        setState(new StopState());
    }
}

// 示例使用
public class StatePatternExample {
    public static void main(String[] args) {
        Elevator elevator = new Elevator();
        elevator.open();
        elevator.close();
        elevator.move();
        elevator.stop();
    }
}

在上述示例中,Elevator 类是上下文类,它维护了一个当前状态的引用 currentStateElevatorState 接口定义了电梯状态的行为方法,具体的状态类(如 OpenStateCloseStateMoveStateStopState)实现了这些行为方法。通过调用上下文类的方法,可以改变电梯的状态,并由当前状态类决定执行的行为。

在示例中,电梯初始状态为停止状态,依次调用 open()close()move()stop() 方法,电梯的状态和行为会相应地改变。输出结果如下:

复制代码
电梯门已经打开
电梯门关闭
电梯开始运行
电梯停止

通过状态模式,我们可以将复杂的状态逻辑封装在具体状态类中,使得代码更加清晰、可扩展性更好。

相关推荐
兰令水4 分钟前
【agent第3篇】agent上下文+面经
java·大数据·数据库
木井巳6 分钟前
【DFS解决floodfill算法】岛屿数量
java·算法·leetcode·深度优先
弹简特7 分钟前
【Java项目-轻聊】08-用户管理模块-实现获取用户信息+头像上传+显示头像
java·开发语言·springboot
贺国亚16 分钟前
Buy领域智能体-Spring-AI全量工程
java·人工智能·spring
不想吃饭e16 分钟前
uniapp-图片,视频上传组件封装
java·uni-app·音视频
迷藏49423 分钟前
双阶段动态权重匹配系统:高效精准的工业级解决方案
java·junit
开源推荐官29 分钟前
2026 三大国产优质开源商城深度测评:VortMall、Tigshop、Jinor 选型全解析
java·开源
We Just Keep growing31 分钟前
【MySQL运维篇】——日志、主从复制、分库分表、读写分离
java·运维·数据库·windows·学习·mysql
change_fate31 分钟前
ERR_PNPM_WORKSPACE_PKG_NOT_FOUND In ...
java·服务器·前端
kakawzw1 小时前
微服务组件源码2——Spring Ribbon原理(基于RibbonLoadBalancerClient)
java·微服务·ribbon