【设计模式】状态模式

设计模式之状态模式

状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

应用场景

  • 对象的行为取决于其状态,并且必须根据该状态在运行时更改其行为。

  • 通常,几个操作将包含相同的条件结构。State模式将条件的每个分支放在一个单独的类中。可以将对象的状态视为一个对象,它可以独立于其他对象而变化

概括来说,状态模式将行为包装到具体的状态对象中。每个状态对象是抽象状态的子类。状态模式意图是在改变对象的内部状态的时候,行为随之改变。

代码

电灯有两种基本行为 开启、关闭。但是有两个状态,正常和坏掉的状态。将共同的行为封装到统一的状态接口中,再根据不同的状态,创建子类完成不同状态形成不同的行为。

灯再正常状态下能够正常开启,正常关闭。等在坏掉的状态下,不能开启和关闭。状态模式就是根据这个逻辑抽离行为,将具体行为包装到具体状态对象中。

抽象状态角色

public interface State {
    void open();
    void close();
}

具体状态角色

public class NormalState implements State{
    @Override
    public void open() {
        System.out.println("电灯开了!");
    }

    @Override
    public void close() {
        System.out.println("电灯关了!");
    }
}

public class ErrorState implements State {
    @Override
    public void open() {
        System.out.println("电灯开不了!");
    }

    @Override
    public void close() {
        System.out.println("电灯关不了!");
    }
}

环境角色

public class Context {
    //状态参数
    State state;
    public Context(State state) {
        this.state = state;
    }

    public void requestToOpen() {
        state.open();
    }

    public void requestToClose() {
        state.close();
    }
    //状态变化
    public void changeStageTo(State state){
       this.state = state;
    }
}

客户端测试

public class App {
    public static void main(String[] args) {
        Context context = new Context(new NormalState());
        context.requestToOpen();
        context.requestToClose();
        //将状态变更为坏的状态
        context.changeStageTo(new ErrorState());
        context.requestToOpen();
        context.requestToClose();
    }
}

文章作者: Ciwei
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Ciwei !
 上一篇
【设计模式】外观模式 【设计模式】外观模式
设计模式之外观模式外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,使子系统更容易使用。 应用场景 因为子系统随着发展会变更的更复杂,客户端想更简单统一给子系统建立一个公共的调用方式。这样即使
2019-07-31
下一篇 
Spring WebClient 和 RestTemplate阻塞与非阻塞客户端 Spring WebClient 和 RestTemplate阻塞与非阻塞客户端
简介本教程中,我们将对比 Spring 的两种 Web 客户端实现 —— RestTemplate 和 Spring 5 中全新的 Reactive 替代方案 WebClient。 阻塞式 vs 非阻塞式客户端Web 应用中,对其他服务
2019-07-31
  目录