设计模式-状态模式

时间:2022-07-25
本文章向大家介绍设计模式-状态模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

背景

晚上睡觉前,需要关灯睡觉。一关一开,类似状态模式的,而开关主要是用来切换所需要的状态,由于不同的状态产生不同的结果。

状态模式是什么?

状态模式(State Pattern)是设计模式的一种,属于行为模式。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

角色

Context(上下文或称环境):通常用来定义客户感兴趣的接口,同时维护一个来具体处理当前状态的实例对象。

State(抽象状态):用来封装与上下文的一个特定状态所对应的行为。

ConcreteState(状态具体实现):具体实现状态处理的类,每个类实现一个跟上下文相关的状态的具体处理。

状态模式可以干嘛?

状态模式主要用于根据不同的状态进行切换而获取不同的信息或结果,根据客户的请求来根据自身状态进行切换。

优点:

结构清晰:减少了很多判断,避免了代码过多的判断,并且可维护性比较高;

遵循设计原则,封装性强:由于各个状态的职责单一所以单一职责这个原则遵循了。状态的切换是通过内部来实现的,客户不需要知道具体的状态和实现。

缺点:

状态过多会引起代码状态类过多臃肿。

个人理解:

状态就像家里的电灯,开灯,关灯,通过不能的状态展示不同的结果。

状态模式类图

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

实现代码

/**
 * @Auther: csh
 * @Date: 2020/6/12 18:00
 * @Description:Context(上下文或称环境)
 */
public class Context {
    private State state;


    public Context() {
        state = null;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/12 18:03
 * @Description:
 */
public interface State {
    //操作
    public void operation(Context context);
}
/**
 * @Auther: csh
 * @Date: 2020/6/12 18:45
 * @Description:ConcreteState(状态具体实现)
 */
public class OpenState implements State {
    @Override
    public void operation(Context context) {
        System.out.println("触发打开电灯!");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "打开电灯!";
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/12 18:48
 * @Description:ConcreteState(状态具体实现)
 */
public class CloseState implements State {
    @Override
    public void operation(Context context) {
        System.out.println("触发关闭电灯!");
        context.setState(this);
    }

    @Override
    public String toString() {
        return "关闭电灯!";
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/12 18:00
 * @Description:Context(上下文或称环境)
 */
public class Context {
    private State state;


    public Context() {
        state = null;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }
}
/**
 * @Auther: csh
 * @Date: 2020/6/12 18:48
 * @Description:演示开关灯通过状态进行变更。
 */
public class Client {
    public static void main(String[] args) {
        Context context = new Context();
        OpenState openState = new OpenState();
        openState.operation(context);
        System.out.println(context.getState().toString());
        CloseState closeState = new CloseState();
        closeState.operation(context);
        System.out.println(context.getState().toString());
    }
}

结果

触发打开电灯!
打开电灯!
触发关闭电灯!
关闭电灯!

源码下载:https://gitee.com/hong99/design-model/issues/I1IMES

最后

状态模式在实际工作中,相应的状态是结合数据库定义某个字段进行存储的,当用户促发进行变更,而这种模式相对来说也是比较复杂的,不同的场景会根据这个模式的思想可以衍生出很多实现方式,所以设计思维是第一位。