为了账号安全,请及时绑定邮箱和手机立即绑定

状态模式

标签:
Java

一. 定义:

    状态模式:当一个对象内在状态改变时,允许其改变行为,这个对象看起来像改变了其类


    抽象状态角色(State):接口或抽象类,负责对象状态定义,并封装环境角色以实现状态切换

    环境角色(Context):定义客户端需要的接口,并负责具体状态的切换

    具体状态角色(ConcreteState):每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,即本状态下要做的事情,以及本状态如何过渡到其他状态


//抽象状态角色:接口或抽象类,负责对象状态定义,并封装环境角色以实现状态切换public abstract class State {/*** 定义一个环境角色,就是封装状态的变化引起的功能变化,提供子类访问*/protected Context context;public void setContext(Context context) {this.context = context;}//行为1public abstract void handle1();//行为2public abstract void handle2();}


//具体状态角色1public class ConcreteState1 extends State{@Overridepublic void handle1() {//本状态下必须处理的逻辑}@Overridepublic void handle2() {//设置当前状态为state2super.context.setCurrentState(Context.STATE2);//过渡到state2状态,由Context实现super.context.handle2();}}
//具体状态角色2public class ConcreteState2 extends State{@Overridepublic void handle1() {//设置当前状态为state1super.context.setCurrentState(Context.STATE1);//过渡到state1状态,由Context实现super.context.handle1();}@Overridepublic void handle2() {//本状态下必须处理的逻辑}


////环境角色public class Context {//定义状态public final static State STATE1 = new ConcreteState1();public final static State STATE2 = new ConcreteState2();//当前状态private State currentState;//获得当前状态public State getCurrentState() {return currentState;}//设置当前状态public void setCurrentState(State currentState) {this.currentState = currentState;//切换状态this.currentState.setContext(this);}//行为委托public void handle1() {this.currentState.handle1();}public void handle2() {this.currentState.handle2();}}


public class Client {/*** 状态模式:当一个对象内在状态改变时,允许其改变行为,这个对象看起来像改变了其类* @param args*/public static void main(String[] args) {//定义环境角色Context context = new Context2();//初始化状态context.setCurrentState(new ConcreteState1());//行为执行context2.handle1();context2.handle2();}}


    环境角色约束:

        (1)把状态对象声明为静态常量,有几个状态对象就声明几个静态常量。

        (2)环境角色具有状态抽象角色定义的所有行为,具体执行使用委托方式。

二. 状态模式优缺点:

    状态模式优点:

        -- 结构清晰,避免过多的if-else;

        -- 遵循开闭原则和单一原则;

        -- 封装性好。

    状态模式缺点:类膨胀。

三. 状态模式的使用场景及注意事项

    1.使用场景:

        行为随状态改变而改变的场景

        条件、分支判断语句的替代者

    2.注意事项:

        行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态最好不要超过5个。


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消