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

状态模式

作者头像
桑鱼
发布2020-03-18 15:13:51
4540
发布2020-03-18 15:13:51
举报

当代码中存在太多判断分支时,我们可能需要使用状态模式来优化。优化模式解决的问题是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的问题逻辑简化。 概念比较抽象,下面的代码,定义了State抽象状态类,内部使用了Context类,子类实现时在handle中定义与不同状态下的行为。

/**
 * 定义一个抽象状态类,封装与Context的一个特定状态相关的行为
 */
public abstract class State {
    public abstract void Handle(Context context);
}
/**
 * ConcreteState 具体状态,实现与Context状态的一个相关的行为
 */
public class ConcreteStateA extends State {

    @Override
    public void Handle(Context context) {
        System.out.println("Play is in start state");
        context.setState(this);
    }

    public String toString(){
        return "Start State";
    }
}
/**
 * ConcreteState 具体状态,实现与Context状态的一个相关的行为
 */
public class ConcreteStateB extends State {
    @Override
    public void Handle(Context context) {
        System.out.println("Play is in stop state");
        context.setState(this);
    }

    public String toString(){
        return "Stop State";
    }
}
/**
 * Context 是一个带有某个状态的类
 */
public class Context {

    private State state;

    public Context(State state){
        this.state = state;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) { // 定义Context的状态
        this.state = state;
        System.out.println("当前状态: " + state);
    }

    public void request(){ // 对请求做处理,并设置下一状态
        state.Handle(this);
    }
}
public class Main { // 使用 Context 来查看当状态 State 改变时的行为变化。

    public static void main(String[] args) {
        Context context = new Context(new ConcreteStateA());
        context.request();
        Context context1 = new Context(new ConcreteStateB());
        context1.request();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档