(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/52468077冷血之心的博客)

目录

定义如下:

个人理解:

通用类图:

角色介绍:

● State——抽象状态角色

● ConcreteState——具体状态角色

● Context——环境角色

通用源代码:

场景类:

状态模式的优点:

状态模式的缺点:

使用场景:


状态模式又是一个比较难的设计模式

定义如下:

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

个人理解:

通俗的讲,状态模式就是状态的改变引起了行为的改变,但是,我们只能看到行为的改变,看不到状态的改变。

通用类图:

角色介绍:

● State——抽象状态角色

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

● ConcreteState——具体状态角色

每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。

● Context——环境角色

定义客户端需要的接口,并且负责具体状态的切换。

举个例子:

状态模式提供了一种对物质运动的另一个观察视角,通过状态变更促使行为的变化,就类似水的状态变更一样,一碗水的初始状态是液态,通过加热转变为气态,状态的改变同时也引起体积的扩大,然后就产生了一个新的行为:鸣笛或顶起壶盖。

通用源代码:

//抽象状态角色
public abstract class State {//定义一个环境角色,提供子类访问protected Context context;//设置环境角色public void setContext(Context _context){this.context = _context;}//行为1public abstract void handle1();//行为2public abstract void handle2();
}

抽象状态中声明一个环境角色,提供各个状态类自行访问,并且提供所有状态的抽象行为,由各个实现类实现。

//具体状态角色
public class ConcreteState1 extends State {   @Overridepublic void handle1() {//本状态下必须处理的逻辑}@Overridepublic void handle2() {//设置当前状态为stat2super.context.setCurrentState(Context.STATE2);//过渡到state2状态,由Context实现super.context.handle2();}
}
public 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 {public static void main(String[] args) {//定义环境角色Context context = new Context();//初始化状态context.set CurrentState(new ConcreteState1());//行为执行context.handle1();context.handle2();}
}

如上所示:我们只看到了行为发生改变。

状态模式的优点:

● 结构清晰
避免了过多的switch...case或者if...else语句的使用,避免了程序的复杂性,提高系统的可维护性。

● 遵循设计原则
很好地体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态就要增加子类,你要修改状态,你只修改一个子类就可以了。

● 封装性非常好
这也是状态模式的基本要求,状态变换放置到类的内部来实现,外部的调用不用知道类内部如何实现状态和行为的变换。

状态模式的缺点:

每一个状态都是一个子类,容易产生子类膨胀的问题。

使用场景:

● 行为随状态改变而改变的场景
       这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。

● 条件、分支判断语句的替代者
       在程序中大量使用switch语句或者if判断语句会导致程序结构不清晰,逻辑混乱,使用状态模式可以很好地避免这一问题,它通过扩展子类实现了条件的判断处理。

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,我会持续更新,如果有什么问题,可以进群366533258一起交流学习哦~

Java设计模式—状态模式相关推荐

  1. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  2. Java设计模式——状态模式【State Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  3. java设计模式---状态模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述状态(State)模式的: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为 ...

  4. JAVA 设计模式 : 状态模式

    原文出处: 屌丝码农 一.引出状态模式 假设我们现在有一个糖果机项目,那么我们知道正常一般糖果机提供给用户的行为有这么几种:投入硬币.转动曲柄.退出硬币几种行为:那么糖果机呢一般有这几中状态,待机状态 ...

  5. Java设计模式-状态模式(State)

    核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线.隐身.忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1.可以通过改变状 ...

  6. 深入理解Java设计模式——状态模式

    目录 一.什么是状态模式 二.状态模式应用场景 三.状态模式实现 1. 需要重构的代码 四.状态模式与策略模式区别 五.状态模式实现 一.什么是状态模式 状态模式允许一个对象在其内部状态改变的时候改变 ...

  7. java设计模式-状态模式

    状态模式介绍: 当一个对象在内在状态改变时,允许改变起行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况.把状态的判断逻辑转移到表示不同状态的一 ...

  8. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  9. Java 有限状态机 (设计模式——状态模式)

    Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...

最新文章

  1. 通过类名和窗口名查找指定窗口
  2. python 两台机器之间传递数据_Python:通过套接字在两台计算机之间发送数据
  3. php自动计数,PHP 实现精确统计在线人数功能
  4. 【安卓开发 】Android初级开发(十一)Android中多线程
  5. python-面向对象编程设计与开发
  6. java反序列化后不相等_Jackson:使用不同的属性名称序列化/反序列化 - java
  7. Web Service 移除 xmlns
  8. 【设计素材】表格数据形平面海报素材
  9. Java IO类库之CharArrayWriter
  10. SpringData+JPA+mysql, cannot be null when ‘hibernate.dialect‘ not set
  11. centos 搭建nfs服务器
  12. 2008-03-18 中午日出傍晚雨
  13. 基于android p的miui,小米8青春版终于迎来基于AndroidP的MIUI10系统,米粉欢呼
  14. 提升谷歌chrome浏览器下载速度的方法
  15. 网站banner怎样设计才能提高吸引力?
  16. 宽带认证失败连接服务器无响应,路由器宽带账号认证失败的解决办法
  17. #VMware#ESXI ESXI虚拟机安装
  18. mysql load escaped_MySQL load语句详细介绍
  19. 信息学奥赛一本通:2028:【例4.14】百钱买百鸡
  20. [Apple Shapr3D]【续更】【shapr3D】认识Shapr3D,一个简单易用的设计类软件

热门文章

  1. 奇虎360选择IPO “壳概念”很受伤
  2. Word中常用特殊符号的替换表示方法以及相似符号的区别
  3. 国内量化基金发展状趋
  4. Rancher Desktop 一键部署k8s
  5. Golang基础链表
  6. H266编码器 linux,H266视频编解码代码下载与使用
  7. 百度地图切换罗盘后不能正北
  8. 苹果11蓝牙配对不成功怎么办_为啥苹果11连不上蓝牙耳机
  9. python 占位符_Python占位符总结:%方式和format方式
  10. 基于阿里ECS云主机搭建Vuejs工程