Java中的状态模式实例教程
状态模式是一种行为设计模式。适用于当对象的内在状态改变它自身的行为时。
如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为。状态模式Context(环境)和State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的。
Context是包含了状态引用的类,此引用指向一个状态的具体实现。并且帮助把对状态的请求委托给此状态的对象进行处理。看一个具体的例子。
假如想实现电视遥控器,使用简单按键来表现动作。如果状态是ON,电视将被打开,如果状态是OFF,电视将被关闭。
利用if-else条件子句来实现。
package com.journaldev.design.state; public class TVRemoteBasic { private String state=""; public void setState(String state){ this.state=state; public void doAction(){ if(state.equalsIgnoreCase("ON")){ System.out.println("TV is turned ON"); }else if(state.equalsIgnoreCase("OFF")){ System.out.println("TV is turned OFF"); public static void main(String args[]){ TVRemoteBasic remote = new TVRemoteBasic(); remote.setState("ON"); remote.doAction(); remote.setState("OFF"); remote.doAction();
注意:客户端代码需要知道每一个不同的值所代表的遥控器的不同状态。如果这样,假如大量的状态被增加,那么对于被紧紧捆绑在一起的状态实现以及相应的客户端代码,它们的维护及扩展就变得非常困难。
现在使用状态模式实现上述电视控制器。
抽象State接口
首先创建一个状态接口来定义一个方法,此方法需要被不同的具体状态类以及环境类实现。
package com.journaldev.design.state; public interface State { public void doAction();
具体State实现
自此例子中,包含两个状态:一个是打开电视的状态,一个关闭电视的状态。因此,需要创建两个具体状态类代表这两个行为。
package com.journaldev.design.state; public class TVStartState implements State { @Override public void doAction() { System.out.println("TV is turned ON");
package com.journaldev.design.state; public class TVStopState implements State { @Override public void doAction() { System.out.println("TV is turned OFF");
现在我们开始实现Context对象,能改基于内在对象来改变自身的行为。
注意,Context类实现了状态以及保持了对此状态的引用。它能够把对此状态的请求委托到某一具体状态实现中。
完成一个简单地程序对使用状态模式的电视遥控器的测试。
package com.journaldev.design.state; public class TVRemote { public static void main(String[] args) { TVContext context = new TVContext(); State tvStartState = new TVStartState(); State tvStopState = new TVStopState(); context.setState(tvStartState); context.doAction(); context.setState(tvStopState); context.doAction();
上述程序的输出与没用使用任何设计模式的电视控制器的实现类似。
使用状态设计模式的优势就是实现多态性的过程是清晰可见的。状态的改变中产生的错误也较少,另外增加更多的状态以及行为变得容易且更具鲁棒性。此外状态模式也帮助避免if-else子句或者switch-case条件判定逻辑。
状态模式类似于策略模式,请看Java中的策略模式。这就是全部的状态设计模式,希望你喜欢上它了。
转载自 并发编程网 - ifeve.comJava--设计模式-23-状态模式 模板模式(Template Pattern)就是在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中,使得子类可以在不改变一个算法的结构前提下即可重定义该算法的某些特定步骤。
【设计模式】Java设计模式 - 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。
动力节点Java项目实例教程,用Java实现的在线聊天小项目,适合巩固Java基础(附资料源码) 对于学习完JavaSE的小伙伴,急需要做一个JavaSE的综合性项目来练练手,提升综合编码能力,那么该JavaSE实现的DQ在线聊天项目项目就非常适合你来练手,该项目的主要目的是让学完Java SE的同学对Socket网络编程、IO流、线程及线程池等知识进行一些实战综合运用。
相关文章
- Jmeter里的全能java测试sampler - Java request
- [java] JSP post 提交乱码 解决方案
- Java实现本地缓存
- Java实现 LeetCode 445 两数相加 II
- Java实现 LeetCode 327 区间和的个数
- java 中文乱码的解决方法
- java 11 Java Flight Recorder
- 【JAVA】 04-Java中的多线程
- java 15: jstat查看gc状态
- 颜色分类(Java)
- Java设计模式之策略模式与状态模式
- 【java】EJB(Enterprise Java Bean)概述
- Java 关于java.util.LinkedHashMap cannot be cast to 实体类问题答案
- Java设计模式(十) 备忘录模式 状态模式
- java final keyword
- Java的垃圾回收机制
- 保留状态的秘密 - 深入了解Java备忘录模式(Memento Pattern)
- 【java】Java 多态
- 【java】Java线程池实现原理及业务中的实践
- java解析多层嵌套json字符串