首页 > 其他分享 >设计模式-状态模式

设计模式-状态模式

时间:2024-06-19 20:43:16浏览次数:12  
标签:comment 状态 void 模式 context 设计模式 public

状态模式

状态模式也成为状态机模式,是允许对象在内部状态发生改变时改变它的行为。对象看起来好像改变了它的类,属于行为型模式。

角色:

  • 上下文角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换。
  • 抽象状态角色(State):定义该状态下的行为,可以有一个或多个。
  • 具体状态 角色(ConcreteState):具体实现该状态对应的行为,并且在需要的情况下进行状态切换。

状态模式与责任链模式

状态模式与责任链模式都能消除if分支过多的问题,在某些情况下,状态可以理解为责任,此时两种模式都可以使用。
从定义上看,状态模式强调得是一个对象内在状态得改变,而责任链模式强调的是外部节点对象间得改变。
从代码实现上看,他们最大的区别是状态模式知道下一个要进入的状态对象,责任链模式则是由客户端设置下一个节点。

优点

  • 结构清晰:将状态独立成类,消除冗余得if..else或switch..case语句,使得代码更加简洁,提高系统可维护性
  • 将状态转换可视化:通常得状态对象内部都是通过数值来表示状态,状态得切换通过赋值,不够直观;而使用状态模式,是以不同的类进行表示,更加明确。
  • 扩展性好:职责明确且具备扩展性。

缺点

  • 类膨胀
  • 结构与实现都较为复杂
  • 对开闭原则支持不太好:修改状态时或新增状态时可能需要修改状态转换部分得源代码

举例:

社区读文章
该场景中,用户状态有两种:登录与未登录。
行为有两种:收藏,评论。
代码如下:
用户状态(抽象)

package com.jdwa.state;

public abstract class UserState {

    protected AppContext context;

    public void setContext(AppContext context){
        this.context = context;
    }

    public abstract void favorite();

    public abstract void comment(String comment);

}

登录状态:

package com.jdwa.state;

public class LoginState extends UserState {
    @Override
    public void favorite() {
        System.out.println("收藏成功");
    }

    @Override
    public void comment(String comment) {
        System.out.print("评论:");
        System.out.println(comment);
    }
}

未登录状态 :

package com.jdwa.state;

public class UnLoginState extends UserState{
    @Override
    public void favorite() {
        this.switch2login();
        this.context.getState().favorite();
    }

    @Override
    public void comment(String comment) {
        this.switch2login();
        this.context.getState().comment(comment);
    }

    private void switch2login(){
        System.out.println("跳转到登录页!");
        this.context.setState(this.context.LOGIN_STATE);
    }
}

上下文环境:

package com.jdwa.state;

public class AppContext {
    public static final UserState LOGIN_STATE = new LoginState();
    public static final UserState UN_LOGIN_STATE = new UnLoginState();

    private UserState currentState = UN_LOGIN_STATE;

    {
        LOGIN_STATE.setContext(this);
        UN_LOGIN_STATE.setContext(this);
    }

    public void setState(UserState state){
        this.currentState = state;
        this.currentState.setContext(this);
    }

    public UserState getState(){
        return this.currentState;
    }

    public void favorite(){
        this.currentState.favorite();
    }

    public void comment(String comment){
        this.currentState.comment(comment);
    }

}

测试:

package com.jdwa.state;

public class Client {
    public static void main(String[] args) {
        AppContext context =  new AppContext();
        context.favorite();
        context.comment("写得好,赞!");
    }
}

结果:

跳转到登录页!
收藏成功
评论:写得好,赞!
欢迎大家留言,以便于后面的人更快解决问题!另外亦欢迎大家可以关注我的微信公众号,方便利用零碎时间互相交流。共勉!

标签:comment,状态,void,模式,context,设计模式,public
From: https://www.cnblogs.com/caozz/p/18257351/state

相关文章

  • 设计模式-迭代器模式
    迭代器模式迭代器模式,又称为游标模式,它提供一种顺序访问集合/容器对象元素的方法,而又无需暴漏集合内部表示。迭代器模式可以为不同的容器提供一致的遍历行为,而不用关心容器内容元素组成结构,属于行为型模式。角色:抽象迭代器Iterator:负责定义访问和遍历元素的接口具体迭代器Con......
  • 整理好了!2024年最常见 20 道设计模式面试题(五)
    上一篇地址:整理好了!2024年最常见20道设计模式面试题(四)-CSDN博客九、什么是命令模式?它如何帮助实现解耦?命令模式(CommandPattern)是一种行为设计模式,它将一个请求或操作封装为一个对象。这种模式的主要目的是将发起请求的对象与执行请求的对象解耦,从而让不同的请求、队列或者......
  • 【扩散映射+线性卡尔曼滤波+Koopman算子】一种用于高维非线性随机动力系统状态估计的
     ......
  • 链动2+1营销策略 分销裂变商业模式 干货解析
    链动2+1是一个集团队搭设、快速提升产品销量,与消费者做到合作共赢的一个商业模式让用户在享受购物折扣的同时,也能获得相对收益,同时公司也能达到产品快速销售这样的一个目的,而链动2+1也是目前速度最快最有效的裂变模式,留客率非常高。模式框架内只有两个身份:代理、老板1.成......
  • 《产流模式的发现与发展》-芮孝芳-2013年1月发表于期刊<水利水电科技进展>
    摘要:回顾了产流理论的起源,指出Horton产流理论、Kohler与Linsley的5变量合轴相关图形式的降雨径流相关图,以及Dunne通过实验对Horton产流理论的拓展,奠定了产流理论和流域产流量计算方法的基础。总结了中国自20世纪50年代以来在这一领域的主要实践和理论探索,指......
  • 多线程设计模式之Worker Thread模式
    以前用C/C++写进程池,要么一下子fork最大进程数,要么来一个任务fork一个进程。多线程也可以这样设计,并总结这种模式为WorkerThread模式。类图如下:具体实现参考如下代码(一次性开启足够多的线程):1)Request......
  • 行为型模式-状态模式
    状态模式模式是什么   状态模式是一种行为型设计模式,它允许对象在内部状态发生改变时改变它的行为。在状态模式中,对象的行为是基于当前状态来决定的,对象会根据不同的状态来执行不同的操作。这样可以将复杂的状态逻辑封装在具体的状态类中,使得代码更加可维护、可扩展,并且符......
  • EtherCAT主站SOEM -- 44 -- win-vs-soem-win10及win11系统VisualStudio-SOEM-控制电机
    EtherCAT主站SOEM--44--win-vs-soem-win10及win11系统VisualStudio-SOEM-控制电机走周期同步位置模式(CSP模式)0QT-SOEM及STM32F767-SOEM视频欣赏及源代码链接:0.1Linux--Ubuntu系统之QT-SOEM博客、视频欣赏及源代码链接0.2STM32F767-SOEM博客、视频欣赏及源......
  • 【状态估计】非线性受控动力系统的线性预测器——Koopman模型预测MPC(Matlab代码实现)
     ......
  • 线程的状态,中断及守护线程
    线程的状态在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了。因此,Java线程的状态有以下几种:New:新创建的线程,尚未执行;Runnable:运行中的线程,正在执行run()方法的Java代码;Blocked:运行中的线程,因为某......