Dotcpp  >  编程教程  >  行为型模式(Behavioral Patterns)  >  状态模式

状态模式

点击打开在线编译器,边学边练

状态模式的主要目的是让一个对象在不同的状态下表现出不同的行为。通过将对象的状态封装成独立的类,状态模式可以使对象的状态变化更加可控和灵活,同时减少了相互依赖的复杂性。

实际上,我们每天都在使用状态模式。想象一下,手机的电源开关就是一个很好的例子。根据手机的不同状态(开机、关机、待机、通话中),电源开关的行为也是不同的。

在状态模式中,通常有以下几个关键角色:

1. 上下文(Context):它定义了客户端所感兴趣的接口,同时维护一个当前状态的引用对象;上下文对象将客户端的请求转发给当前状态对象处理。

2. 抽象状态类(Abstract State):它是状态类的抽象基类,定义了一个接口,用于封装具体状态类的共同行为。

3. 具体状态类(Concrete State):它是抽象状态类的具体实现,实现了在特定状态下对象的行为。

状态模式

下面是一个简单的Java示例,展示了如何使用状态模式:

// 上下文类
public class Context {
    private State state;
    
    public void setState(State state) {
        this.state = state;
    }
    
    public void doAction() {
        state.doAction(this);
    }
}
// 抽象状态类
public interface State {
    void doAction(Context context);
}
// 具体状态类
public class ConcreteStateA implements State {
    @Override
    public void doAction(Context context) {
        System.out.println("当前状态是 A");
        context.setState(new ConcreteStateB()); // 状态切换
    }
}
public class ConcreteStateB implements State {
    @Override
    public void doAction(Context context) {
        System.out.println("当前状态是 B");
        context.setState(new ConcreteStateA()); // 状态切换
    }
}
public class StatePatternDemo {
    public static void main(String[] args) {
        Context context = new Context();
        
        State stateA = new ConcreteStateA();
        context.setState(stateA);
        context.doAction(); // 输出:当前状态是 A
        
        State stateB = new ConcreteStateB();
        context.setState(stateB);
        context.doAction(); // 输出:当前状态是 B
    }
}

在这个示例中,Context类是上下文类,它维护了一个当前状态的引用,并将客户端的请求转发给当前状态对象处理。

State接口定义了抽象状态类的接口,而ConcreteStateA和ConcreteStateB是具体状态类的实现,它们根据具体的状态执行不同的行为,并切换到其他状态。

通过使用状态模式,我们可以让对象在不同的状态下表现出不同的行为,同时可以很方便地扩展和修改状态的行为。这在处理复杂的逻辑和状态转换时非常有用。


本文固定URL:https://www.dotcpp.com/course/1384

上一课:

观察者模式

下一课:

空对象模式

Dotcpp在线编译      (登录可减少运行等待时间)