Java中的状态模式
2017-07-06 13:20
190 查看
原文链接:http://ifeve.com/state-design-pattern-in-java-example-tutorial/
状态模式是一种行为设计模式。适用于当对象的内在状态改变它自身的行为时。
如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为。状态模式Context(环境)和State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的。
Context是包含了状态引用的类,此引用指向一个状态的具体实现。并且帮助把对状态的请求委托给此状态的对象进行处理。看一个具体的例子。
假如想实现电视遥控器,使用简单按键来表现动作。如果状态是ON,电视将被打开,如果状态是OFF,电视将被关闭。
利用if-else条件子句来实现。
注意:客户端代码需要知道每一个不同的值所代表的遥控器的不同状态。如果这样,假如大量的状态被增加,那么对于被紧紧捆绑在一起的状态实现以及相应的客户端代码,它们的维护及扩展就变得非常困难。
现在使用状态模式实现上述电视控制器。
现在我们开始实现Context对象,能改基于内在对象来改变自身的行为。
注意,Context类实现了状态以及保持了对此状态的引用。它能够把对此状态的请求委托到某一具体状态实现中。
上述程序的输出与没用使用任何设计模式的电视控制器的实现类似。
使用状态设计模式的优势就是实现多态性的过程是清晰可见的。状态的改变中产生的错误也较少,另外增加更多的状态以及行为变得容易且更具鲁棒性。此外状态模式也帮助避免if-else子句或者switch-case条件判定逻辑。
状态模式类似于策略模式,请看Java中的策略模式。这就是全部的状态设计模式,希望你喜欢上它了。
状态模式是一种行为设计模式。适用于当对象的内在状态改变它自身的行为时。
如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及if-else条件子句来扮演针对对象的不同行为。状态模式Context(环境)和State(状态)分离的方式既保证状态与行为的联动变化,又使得这种变化是条理明晰且松耦合的。
Context是包含了状态引用的类,此引用指向一个状态的具体实现。并且帮助把对状态的请求委托给此状态的对象进行处理。看一个具体的例子。
假如想实现电视遥控器,使用简单按键来表现动作。如果状态是ON,电视将被打开,如果状态是OFF,电视将被关闭。
类图
利用if-else条件子句来实现。
01 | package com.journaldev.design.state; |
02 |
03 | public class TVRemoteBasic { |
04 |
05 | private String state= "" ; |
06 |
07 | public void setState(String state){ |
08 | this .state=state; |
09 | } |
10 |
11 | public void doAction(){ |
12 | if (state.equalsIgnoreCase( "ON" )){ |
13 | System.out.println( "TV ); |
14 | } else if (state.equalsIgnoreCase( "OFF" )){ |
15 | System.out.println( "TV ); |
16 | } |
17 | } |
18 |
19 | public static void main(String args[]){ |
20 | TVRemoteBasic new TVRemoteBasic(); |
21 |
22 | remote.setState( "ON" ); |
23 | remote.doAction(); |
24 |
25 | remote.setState( "OFF" ); |
26 | remote.doAction(); |
27 | } |
28 |
29 | } |
现在使用状态模式实现上述电视控制器。
抽象State接口
首先创建一个状态接口来定义一个方法,此方法需要被不同的具体状态类以及环境类实现。1 | package com.journaldev.design.state; |
2 |
3 | public interface State { |
4 |
5 | public void doAction(); |
6 | } |
具体State实现
自此例子中,包含两个状态:一个是打开电视的状态,一个关闭电视的状态。因此,需要创建两个具体状态类代表这两个行为。01 | package com.journaldev.design.state; |
02 |
03 | public class TVStartState implements State { |
04 |
05 | @Override |
06 | public void doAction() { |
07 | System.out.println( "TV ); |
08 | } |
09 |
10 | } |
01 | package com.journaldev.design.state; |
02 |
03 | public class TVStopState implements State { |
04 |
05 | @Override |
06 | public void doAction() { |
07 | System.out.println( "TV ); |
08 | } |
09 |
10 | } |
Context类实现
01 | package com.journaldev.design.state; |
02 |
03 | public class TVContext implements State { |
04 |
05 | private State tvState; |
06 |
07 | public void setState(State |
08 | this .tvState=state; |
09 | } |
10 |
11 | public State |
12 | return this .tvState; |
13 | } |
14 |
15 | @Override |
16 | public void doAction() { |
17 | this .tvState.doAction(); |
18 | } |
19 |
20 | } |
测试程序
完成一个简单地程序对使用状态模式的电视遥控器的测试。01 | package com.journaldev.design.state; |
02 |
03 | public class TVRemote { |
04 |
05 | public static void main(String[] |
06 | TVContext new TVContext(); |
07 | State new TVStartState(); |
08 | State new TVStopState(); |
09 |
10 | context.setState(tvStartState); |
11 | context.doAction(); |
12 |
13 | context.setState(tvStopState); |
14 | context.doAction(); |
15 |
16 | } |
17 |
18 | } |
使用状态设计模式的优势就是实现多态性的过程是清晰可见的。状态的改变中产生的错误也较少,另外增加更多的状态以及行为变得容易且更具鲁棒性。此外状态模式也帮助避免if-else子句或者switch-case条件判定逻辑。
状态模式类似于策略模式,请看
相关文章推荐
- Java设计模式之State(状态模式)
- Java 状态模式
- JAVA与模式之状态模式
- 设计模式(二十)----- 状态模式(State)----(JAVA版)
- java 设计模式实例 - 状态模式
- 深入浅出Java设计模式之状态模式
- 设计模式--行为模式--状态模式--Java
- Java 设计模式 之 状态模式(State)
- java设计模式-状态模式
- java设计模式——状态模式
- 设计模式解析和实现(C++, java)之二十--状态(state)模式
- java设计模式--状态模式--04
- java状态模式
- java设计模式之状态 模式State
- java设计模式-状态模式
- java设计模式-状态模式(STATE)
- Java 状态模式(State)
- java设计模式之状态设计模式
- Java设计模式九:状态模式(State)
- java模式之状态模式