Java状态模式详解(角色实例及应用场景)

Java状态模式详解(角色实例及应用场景)-mikechen

Java状态模式是常用的Java设计模式,下面我重点详解Java状态模式的角色实现与应用场景@mikechen

Java状态模式定义

Java状态模式是一种行为型设计模式,它允许一个对象在其内部状态发生改变时改变它的行为。

 

Java状态模式应用场景

Java 状态模式常常应用于以下场景中:

1.对象在不同状态下具有不同的行为

例如:一个订单在不同状态下,需要执行不同的处理逻辑,例如:待付款、待发货、已发货等场景,就比较适合Java状态模式。

2.一个对象的状态可以在运行时动态切换

例如:一个电视机的状态可以是开启、关闭、静音等,每个状态都对应一组固定的行为,例如:开启状态下可以调整音量、切换频道等。

3.对象的行为具有状态依赖性

例如:一个线程在不同的状态下,需要执行不同的操作。例如:新建状态下需要调用 start() 方法启动线程,终止状态下需要调用 stop() 方法停止线程等。

 

Java状态模式组件角色

Java状态模式类图实现,主要包含以下主要角色:

Java状态模式详解(角色实例及应用场景)-mikechen

1.环境(Context)

环境角色通常包含:一个或多个状态角色,可以通过调用状态角色的方法来改变环境的状态和执行相应的操作。

2.抽象状态(State)

抽象状态是一个接口或抽象类,抽象状态通常包含一个或多个方法,用于处理当前状态下的行为。

3.具体状态(Concrete State)

具体状态是抽象状态的实现,具体状态可以在环境的运行时动态切换,从而改变环境的行为。

 

Java状态模式实现例子

下面是一个简单的 Java 状态模式的示例,包含上述三种角色:

// 抽象状态
public interface State {
    void handle(Context context);
}

// 具体状态1
public class ConcreteState1 implements State {
    @Override
    public void handle(Context context) {
        // 处理具体状态1的行为
        System.out.println("Handling in ConcreteState1");
        // 切换到具体状态2
        context.setState(new ConcreteState2());
    }
}

// 具体状态2
public class ConcreteState2 implements State {
    @Override
    public void handle(Context context) {
        // 处理具体状态2的行为
        System.out.println("Handling in ConcreteState2");
        // 切换到具体状态1
        context.setState(new ConcreteState1());
    }
}

// 环境
public class Context {
    private State state;

    public Context() {
        state = new ConcreteState1();  // 初始状态为具体状态1
    }

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

    public void request() {
        state.handle(this);  // 根据当前状态执行相应的操作
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        context.request();  // Output: Handling in ConcreteState1
        context.request();  // Output: Handling in ConcreteState2
        context.request();  // Output: Handling in ConcreteState1
    }
}

在上面的示例中:

  1. State 是抽象状态,定义了具体状态所需实现的 handle 方法;
  2. ConcreteState1 和 ConcreteState2 是具体状态,实现了 State 接口,并根据当前状态执行相应的操作;
  3. Context 是环境角色,包含一个状态成员变量,用于存储当前状态,并根据状态执行相应的操作;

以上就是Java状态模式详解,更多内容请查看:Java设计模式:23种设计模式(万字图文全面总结)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法