状态模式:

状态模式定义:

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

状态模式UMl类图:

状态模式Java代码实现

public class Context {//定义一个状态,并且设置该状态可以读写private State state;public State getState() {return state;}public void setState(State state) {this.state = state;}//处理请求,并设置下一个状态public void getResult(){state.handle(this);}
}
public interface State {//定义一个状态接口,并抽象处理请求和设置下一状态方法void handle(Context context);}
public class ConcreteStateA implements State{@Overridepublic void handle(Context context) {//设置下一个状态ConcreteStateBcontext.setState(new ConcreteStateB());}}
public class ConcreteStateB implements State{@Overridepublic void handle(Context context) {//设置下一个状态为ConcreteStateAcontext.setState(new ConcreteStateA());}
}

状态模式例子:

现在很多人家里的灯都有两个开关,床头开关和进门开关。两个开关都是双向开关,如果等是开着的,则按下开关后等就会熄灭,如果等是关着的,按下开关,等就会打开。下面是开关控制等开关的具体实现。
//灯类,拥有一个开关状态,并且由一个changer开关控制
public class Light {private Changer  changer;private String state;public Light(Changer changer, String state) {super();this.changer = changer;this.state = state;}public Changer getChanger() {return changer;}public void setChanger(Changer changer) {this.changer = changer;}public String getState() {return state;}public void setState(String state) {this.state = state;}public void changeLight(){changer.changeState(this);}
}
public interface Changer {//开关接口,定义开关灯的方法public void changeState(Light light);
}
public class ChangerOn implements Changer{//开关类具体实现,如果开着,则关闭,否则由关闭开关去实现@Overridepublic void changeState(Light light) {if("on".equals(light.getState())){System.out.println("灯正在开着,现在关灯");light.setState("Off");light.setChanger(new ChangerOff());}else{light.setChanger(new ChangerOff());light.changeLight();}}}
public class ChangerOff implements Changer {//关闭开关类具体实现,如果关着,则打开,否则由关闭开关去实现@Overridepublic void changeState(Light light) {if("off".equals(light.getState())){System.out.println("灯正在关着,现在开灯");light.setState("on");light.setChanger(new ChangerOn());}else{light.setChanger(new ChangerOn());light.changeLight();}}}

主方法:

public class Main {public static void main(String[] args) {Changer changer =new ChangerOn();//初始状态,灯开着Light light = new Light(changer, "on");//Light light = new Light(changer, "off");light.changeLight();}
}

自己写的例子,感觉不是特别贴切,但是一时也没有想到更好的。。。。。

------------------------------------------------分割线--------------------------------------------

状态模式和策略模式的区别:

在网上查了一些资料,感觉知乎上一个名为胖胖的大牛解释的非常好,虽然有点污。本想借鉴一下,但是不让转载,这里只能附上链接,大家可以自己去看一下。https://www.zhihu.com/question/23693088

区别:

状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。

联系:

状态模式和策略模式都是为具有多种可能情形设计的模式,把不同的处理情形抽象为一个相同的接口,符合对扩展开放,对修改封闭的原则。 还有就是,策略模式更具有一般性一些,在实践中,可以用策略模式来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理,在这点上策略模式是包含状态模式的功能的,策略模式是一个重要的设计模式。

转载于:https://www.cnblogs.com/xsyfl/p/6842509.html

大话设计模式读书笔记(十三) 状态模式相关推荐

  1. 大话设计模式读书笔记之状态模式

    1.定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.主要解决的问题是当控制一个对象状态转换的条件表达式过于复杂时把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复 ...

  2. 大话设计模式读书笔记之原型模式

    由于大话这本书是以C#语言为基础写就的,本设计模式的例子中使用了一些c#中的API,因此就不再引用此书中的例子了,参考了一篇博客园中的大神写就的浅显易懂的JAVA版原型模式,在此奉上链接,以供大家学习 ...

  3. 大话设计模式读书笔记--4.代理模式

    生活中的例子: 班主任让班长通知班委下午3点开会 班长就是班主任的代理 代理模式的目的是: 隐藏真实访问对象,同时可以处理别的事情 定义 代理模式:为其他对象提供一种代理以控制对这个对象的访问 也就是 ...

  4. 大话设计模式读书笔记--6.原型模式

    简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式 ...

  5. 大话设计模式读书笔记10----外观模式(Facade)

    外观模式(Facade):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更容易使用. 1.在设计初级阶段,应该要有意识的将不同的两个层分离. 2.层与层之间建 ...

  6. 大话设计模式读书笔记之桥接模式

    1.定义: 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 需要理解,什么叫抽象与它的实现分离,并不是说,让抽象类与其派生类分离,因为这没任何意义.实现指的是抽象类和它的派生类用来实现自己的对 ...

  7. 大话设计模式读书笔记

    主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...

  8. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  9. 设计模式学习笔记(6) - 状态模式

    状态模式与策略模式很像,真的很像. 下面举个例子来说明,我们都知道银行经常将用户划分个三六九等,划分的方法很简单,就是用户的存款.下面用php代码来模拟下这个过程: <?php /** *  状 ...

最新文章

  1. Linux 裸设备基础知识(转)
  2. 移动Web开发图片自适应两种常见情况解决方案
  3. Vue优化策略_项目上线_02
  4. 丰田pcs可以关闭吗_论安全性能,广汽丰田TNGA车型如何?
  5. LINUX SHELL脚本如何判断一个目录下有没有文件
  6. 车牌识别代码OpenCV
  7. 猿创征文|网络安全的十大经典工具介绍
  8. STM32下载程序的三种方法(串口、ST-LINK、 ST-LINK Utility)
  9. 296.deepin下载安装、root改密、cpu不降频、修改快捷键、创建启动器快捷方式、win文件访问、直接进win无deepin启动项...
  10. 升级MacOS Big Sur之后VMware Fusion各种问题解决
  11. seo外链怎么做?网站外链怎么发布
  12. opencv 判断点在多边形内外
  13. 前端和Java,学哪个好?
  14. python qt5 增加文本框_PyQt5 文本输入框自动补全 QLineEdit
  15. U盘文件全部变成只读模式的解决办法
  16. Shogun网站上的关于主流机器学习工具包的比较
  17. 部门经理的职责是什么
  18. 年薪500万,元宇宙画的饼能落地吗?
  19. 【mba旅游管理论文】天乐湖旅游度假区发展现状及问题分析(节选)
  20. BGP属性:MED、 METRIC属性

热门文章

  1. spring配置日志
  2. 【Bootstrap】 bootstrap-table表格组件
  3. 使用DOM动态创建标签
  4. xgboost: 速度快效果好的boosting模型
  5. 在debian上安装vmware tools的问题
  6. oracle 查看锁死的表
  7. 理解C#中的委托与事件
  8. 树莓派 树莓派 编c++_树莓派6年
  9. 适合初学者的安卓开源项目_开源初学者的6个起点
  10. 优必选能开放软硬件源代码吗_开放式硬件为何胜出