『设计模式』状态模式(不起花里胡哨的名字了)
23种设计模式+额外常用设计模式汇总 (持续更新)
状态模式
- 允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
- 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表系不同状态的一系列类当中,可以把复杂的逻辑简化。
- 每个人、事务在不同的状态下会有不同表现动作,而一个状态又会在不同的表现下转移到写一个不同的状态。
- 在State模式中我们将状态逻辑和动作实现进行分离。当一个操作中要维护大量的分支语句,并且这些分支依赖于对象的状态。State模式将每一个分支都封装到独立的类中。
State模式结构
优点
- 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
- 消除庞大的条件分支语句,把各种状态转移逻辑分布到State的子类之间,减少了相互间的依赖。
- 显式化进行状态转换:为不同的状态引入独立的对象,使得状态的转换变得更如明确。而且状态对象可以保证上下文不会发生内部状态不一致的状况,因为上下文中只有一个变量来记录状态对象,只要为这一个变量赋值就可以了。
缺点
State模式问题主要是逻辑分散化,状态逻辑分布到了很多的State的子类中,很难看到整个的状态逻辑图,这也带来了代码的维护问题。
本质
- 根据状态来分离和选择行为
- 状态模式是状态驱动,由上下文负责。
State模式和Strategy模式简单对比
- State模式和Strategy模式有很大程度上的相似:它们都有-一个Context类,都是通过委托(组合)给一个具有多个派生类的多态基类实现Context的算法逻辑。
- 两者最大的差别就是State模式中派生类持有指向Context对象的引用,并通过这个引用调用Context中的方法,但在Strategy模式中就没有这种情况。
实现
public abstract class State {public abstract void Handle(Context context);
}
public class ConcreteStateA extends State{@Overridepublic void Handle(Context context) {context.setState(new ConcreteStateB()); //设置A的下一个状态是B}}
class ConcreteStateB extends State{@Overridepublic void Handle(Context context) {context.setState(new ConcreteStateC()); //设置B的下一个状态是C}}
class ConcreteStateC extends State{@Overridepublic void Handle(Context context) {context.setState(new ConcreteStateA()); //设置C的下一个状态是A}}
public class Context {State state;public Context(State state) { //定义Context的初始状态super();this.state = state;}public State getState() {return state;}public void setState(State state) {this.state = state;System.out.println("当前状态为"+state);}public void request(){state.Handle(this); //对请求做处理并且指向下一个状态}
}
实例
【问题】
工作流中的请假流程:
- 某人提出请假申请,先由项目经理审批,如果项目经理不同意,审批就直接结束。
- 如项目经理同意,再看是否超过3天,如果三天以内,审批直接结束。
- 否则,交给部门经理,部门络理审核后,无论是否同意,审批直接结束。
package 状态模式;public class Context {private State st;private int days;private String name;private String pro;private String dept;private boolean ProjectManager,DepartmentManager,BossManager;public Context(int days, String name, String pro, String dept, boolean projectManager, boolean departmentManager,boolean boss) {super();this.days = days;this.name = name;this.pro = pro;this.dept = dept;ProjectManager = projectManager;DepartmentManager = departmentManager;this.BossManager = boss;}public boolean isBossManager() {return BossManager;}public void setBossManager(boolean bossManager) {BossManager = bossManager;}public Context( int days, String name, String pro, String dept, boolean projectManager,boolean departmentManager) {super();this.days = days;this.name = name;this.pro = pro;this.dept = dept;ProjectManager = projectManager;DepartmentManager = departmentManager;}public Context() {super();// TODO Auto-generated constructor stub}public int getDays() {return days;}public void setDays(int days) {this.days = days;}public String getName() {return name;}public void setName(String name) {this.name = name;}public boolean isProjectManager() {return ProjectManager;}public void setProjectManager(boolean projectManager) {ProjectManager = projectManager;}public boolean isDepartmentManager() {return DepartmentManager;}public String getDept() {return dept;}public void setDept(String dept) {this.dept = dept;}public String getPro() {return pro;}public void setPro(String pro) {this.pro = pro;}public void setDepartmentManager(boolean departmentManager) {DepartmentManager = departmentManager;}public void leave() {st.leave(this);}}package 状态模式;public abstract class State {public abstract void leave(Context con);}package 状态模式;public class Accept extends State {@Overridepublic void leave(Context con) {if(con.isProjectManager()==false) {System.out.println(con.getPro()+"经理不同意请假!"+con.getName()+"的请假");}else {Less3 tdl=new Less3();tdl.leave(con);}}}package 状态模式;public class Less3 extends State {@Overridepublic void leave(Context con) {if(con.getDays()<=3) {System.out.println(con.getPro() +"项目经理同意!"+con.getName()+"的请假审批通过!共请假"+con.getDays()+"天!");}else {System.out.println("请假时间超过三天,请移至"+con.getDept()+"部门经理处!");More3_Less7 tdo=new More3_Less7();tdo.leave(con);}}}package 状态模式;public class More3_Less7 extends State {@Overridepublic void leave(Context con) {if(con.getDays()<=7) {System.out.println(con.getDept()+"部门经理同意!"+con.getName()+"的请假审批通过!共请假"+con.getDays()+"天!");}else {System.out.println("请假时间超过7天,请移至总经理!");More7 tdo=new More7();tdo.leave(con);}}}package 状态模式;public class More7 extends State {@Overridepublic void leave(Context con) {if(con.isBossManager()==true) {System.out.println(con.getPro()+"项目经理同意!"+con.getDept()+"部门经理同意!总经理同意!"+con.getName()+"的请假审批通过!共请假"+con.getDays()+"天!");}else {System.out.println(con.getPro()+"项目经理同意!"+con.getDept()+"部门经理同意!总经理不同意!"+con.getName()+"的请假审批不通过!");}}}package 状态模式;public class Client {public static void main(String[] args) {Context con = new Context(8,"菜鸡","设计模式","设计",true,true,true);con.setName("菜鸡");con.setPro("设计模式");con.setDept("设计");con.setDays(8);con.setProjectManager(true);con.setDepartmentManager(true);con.leave();}}
『设计模式』状态模式(不起花里胡哨的名字了)相关推荐
- 『设计模式』备忘录模式(memento)下象棋,我就想悔棋怎么办
23种设计模式+额外常用设计模式汇总 (持续更新) Memento模式的关键就是要在不破坏封装性的前提下,捕获一个对象的内部状态并在该对象之外保存这个状态.这样以后就可以利用该保存的状态实施恢复操作. ...
- 『设计模式』外观模式--这篇博客也太明了吧
23种设计模式+额外常用设计模式汇总 (持续更新) 外部与一个子系统的通信必须通过一个统一的外观(Facade)对象进行,这就是外观模式. 外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的 ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- java设计模式之状态模式_Java中的状态设计模式
java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...
- 【转】设计模式 ( 十七) 状态模式State(对象行为型)
设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ...
- 图解java多线程设计模式 pdf_图解Java设计模式之状态模式
图解Java设计模式之状态模式 APP抽象活动问题 状态模式基本介绍 状态模式的原理类图 状态模式解决APP抽奖问题 状态模式的注意事项和细节 APP抽象活动问题 请编写程序完成APP抽象活动,具体要 ...
- android 状态模式,Android编程设计模式之状态模式详解
本文实例讲述了Android编程设计模式之状态模式.分享给大家供大家参考,具体如下: 一.介绍 状态模式中的行为是由状态来决定的,不同的状态下有不同的行为.状态模式和策略模式的结构几乎完全一样,但它们 ...
- python的out模式_Python设计模式之状态模式
状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态机?状态机是一个抽象机 ...
- 码农小白 设计模式篇 状态模式
码农小白 设计模式篇 状态模式 1.状态的认识 2.面向过程思维的代码实现 小结: 3.面向对象实现 小结 4.用状态模式实现 1.状态模式的简介 2.状态模式的好处 3.状态模式的使用 4.代码实现 ...
最新文章
- 深度学习|实例分割:3D-BoNet
- HDU 3625 Examining the Rooms【第一类斯特灵数】
- html语言剖析,HTML语言剖析(十三) 其他标记
- D2 第11届前端技术论坛记录
- windows环境中利用NMake工具编译连接C++源代码
- Corona按钮只能让点击一次
- 深度学习基础(一)起源
- android 名片识别 简书,iOS 自己实现 名片识别 三 图片处理
- 日本京都大学再次斩获诺贝尔奖,对比清华大学,究竟哪里有差距?
- 【JUC】第六章 Fork/Join 框架、CompletableFuture
- c++ ado操作mysql_利用ADO在C++下操作access数据库
- js拖动窗口 用层模拟可移动的小窗口
- 类构造函数(Constructor)单冒号:用法
- 帮你轻松理解Commonjs、AMD、CMD、ES6的区别
- CSS常用基础效果---文字与图片并排+导航栏
- 福昕阅读器如何显示pdf文件的缩略图
- 滴滴DSRC抢楼大赛,十一快车券飞起来
- ACdream 1069 无耻的出题人 无聊写着玩的题
- 【7gyy】让Win7系统下的硬盘不在狂闪的诀窍
- 深藏不漏!.cc域名接连高价成交!最高突破6位数!
热门文章
- Android开发之EditText编辑框光标位置
- svn错误提示: svn is scheduled for addition, but is miss
- 监听输入 vue_深度对比vue与react创建APP的差别,值得收藏
- 虚拟服务器放2个网站,如何一个虚拟主机空间放两个网站的基本原理
- cpucores_CPUCores怎么用 CPUCores使用方法指南_3DM单机
- 深度优先搜索知识总结
- 一分钟学会Git操作流程
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
- 会话的清除与建立网络磁盘
- 什么是注入式攻击(2)