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

状态模式

作者头像
晚上没宵夜
发布2022-09-08 15:05:58
2120
发布2022-09-08 15:05:58
举报

最近在看状态机,先逐步从状态模式学起

1. 状态模式(State Pattern)

允许对象在内部状态改变时改变它的行为, 对象看起来好象改了它的类。在传统中编程中使用 if-else 对所有情况判断并作出对应的行为,这不仅违背了开闭原则,而且会显得臃肿难于阅读和维护,状态模式是用来解决这个问题的

状态模式的组成:

  • State:状态接口
  • ConcreteState:状态实现类
  • Context:环境

2. 流程

灯有打开和关闭两种状态,我们用灯的开关状态来说明状态模式:(下面没有使用状态模式)

代码语言:javascript
复制
public class Light {
    
    private String state;

    public String getState() {
        return state;
    }

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

    // 这里状态只有两种,若情况较多则会臃肿难以维护
    public void handle() {
        if ("TurnOn".equals(state)) {
            System.out.println("灯亮了");
        } else if ("TurnOff".equals(state)) {
            System.out.println("灯灭了");
        }
    }
}

2.1 State

代码语言:javascript
复制
public interface State {
    void handle(Context context);
}

2.2 TurnOnState

代码语言:javascript
复制
public class TurnOnState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态 TurnOn: 灯亮了");
        context.setState(this);
    }
}

2.3 TurnOffState

代码语言:javascript
复制
public class TurnOffState implements State {
    @Override
    public void handle(Context context) {
        System.out.println("当前状态 TurnOff: 灯灭了");
        context.setState(this);
    }
}

2.4 Context

代码语言:javascript
复制
public class Context {
    private State state;

    public State getState() {
        return state;
    }

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

2.5 测试

使用了状态模式会让代码结构复杂起来,但条件逻辑会更加清晰

代码语言:javascript
复制
public class Test {
    public static void main(String[] args) {

        Context context = new Context();

        TurnOnState turnOnState = new TurnOnState();
        turnOnState.handle(context);

        TurnOffState turnOffState = new TurnOffState();
        turnOffState.handle(context);
    }
}

// 当前状态 TurnOn: 灯亮了
// 当前状态 TurnOff: 灯灭了

状态模式和策略模式较为相似,区别在于状态模式是依靠状态来改变行为,且有状态转变

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 状态模式(State Pattern)
  • 2. 流程
    • 2.1 State
      • 2.2 TurnOnState
        • 2.3 TurnOffState
          • 2.4 Context
            • 2.5 测试
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档