前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式-状态模式

设计模式-状态模式

作者头像
逍遥壮士
发布2020-09-18 11:28:05
4980
发布2020-09-18 11:28:05
举报
文章被收录于专栏:技术趋势技术趋势

背景

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

状态模式是什么?

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

角色

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

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

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

状态模式可以干嘛?

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

优点:

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

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

缺点:

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

个人理解:

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

状态模式类图

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

实现代码

代码语言:javascript
复制
/**
 * @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;
    }
}
代码语言:javascript
复制
/**
 * @Auther: csh
 * @Date: 2020/6/12 18:03
 * @Description:
 */
public interface State {
    //操作
    public void operation(Context context);
}
代码语言:javascript
复制
/**
 * @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 "打开电灯!";
    }
}
代码语言:javascript
复制
/**
 * @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 "关闭电灯!";
    }
}
代码语言:javascript
复制
/**
 * @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;
    }
}
代码语言:javascript
复制
/**
 * @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());
    }
}

结果

代码语言:javascript
复制
触发打开电灯!
打开电灯!
触发关闭电灯!
关闭电灯!

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

最后

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 技术趋势 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
  • 源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档