Java中的状态模式
来源:互联网 发布:流媒体服务器 linux 编辑:程序博客网 时间:2024/06/06 04:11
原文链接: http://ifeve.com/state-design-pattern-in-java-example-tutorial/
状态模式是一种行为设计模式。适用于当对象的内在状态改变它自身的行为时。
如果想基于对象的状态来改变自身的行为,通常利用对象的状态变量及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 is turned ON"
);
14
}
else
if
(state.equalsIgnoreCase(
"OFF"
)){
15
System.out.println(
"TV is turned OFF"
);
16
}
17
}
18
19
public
static
void
main(String args[]){
20
TVRemoteBasic remote =
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 is turned ON"
);
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 is turned OFF"
);
08
}
09
10
}
现在我们开始实现Context对象,能改基于内在对象来改变自身的行为。
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 state) {
08
this
.tvState=state;
09
}
10
11
public
State getState() {
12
return
this
.tvState;
13
}
14
15
@Override
16
public
void
doAction() {
17
this
.tvState.doAction();
18
}
19
20
}
注意,Context类实现了状态以及保持了对此状态的引用。它能够把对此状态的请求委托到某一具体状态实现中。
测试程序
完成一个简单地程序对使用状态模式的电视遥控器的测试。
01
package
com.journaldev.design.state;
02
03
public
class
TVRemote {
04
05
public
static
void
main(String[] args) {
06
TVContext context =
new
TVContext();
07
State tvStartState =
new
TVStartState();
08
State tvStopState =
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中的策略模式。这就是全部的状态设计模式,希望你喜欢上它了。
- Java中的状态模式
- Java设计模式编程中的状态模式和策略模式
- Framework中的状态模式
- 生活中的状态模式
- Java设计模式之从[游戏中的兵种状态转换]分析状态(State)模式
- java中的状态模式-继承和组合的使用
- Java 状态模式
- java状态模式
- Java 状态模式(State)
- Java 状态模式
- Java状态模式(State)
- java状态模式
- java状态模式
- java状态模式
- java状态模式
- JAVA-状态设计模式
- Java 状态模式
- Java 状态模式
- 图片在IE8中出现边框的解决办法
- jar中找不到配置文件
- python列表
- python 渗透库大集合
- 带有事务和错误处理的存储过程
- Java中的状态模式
- Maven私服仓库管理: Nexus 3.0
- ORA-28547:连接服务器失败,可能是Oracle Net管理错误
- 图像处理1:python和opencv环境配置
- <java EE 项目 : MyForum (听说可以当毕业设计?)> 效果展示
- Python signal 信号处理模块
- cookie
- plsql连接oracle
- 安卓篇:小白的神经质--RTSP视频流的播放