源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、使用场景
2、核心及实现
一、场景
1、电梯的运行
维修、正常、自动关门、自动开门、向上运行、向下运行、消防状态
2、红绿灯
红灯、黄灯、绿灯
3、 网上购物时,订单的状态
下单、已付款、已发货、送货中、已收货
4、酒店系统中,房间的状态变化
已预订、 已入住、 空闲
以酒店状态为例子,我们可以得到以下关系:

而这种关系可以通过条件语句实现:
if(state.equals("空闲")){
if(operate.equals("网上预订")){
state = "已预定";
}else if(operate.equals("前台办理入住")){
state = "已入住";
}
}else if(state.equals("已预定")){
if(operate.equals("网上退订")){
state = "空闲";
}else if(operate.equals("到店入住")){
state = "已入住";
}
}else if(state.equals("已入住")){
if(operate.equals("退房")){
state = "空闲";
}
}
很明显的,如果房间的状态再细分,或者改变状态的步骤变复杂,这个条件语句的代码需要做很大的改动,导致代码的可维护性非常差!
当遇到这种需要频繁的修改状态时,考虑状态模式。
二、状态模式
1、核心
用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。
2、结构
(1)Context环境类
环境类中维护一个State对象,他是定义了当前的状态。
(2)State抽象状态类
(3)ConcreteState具体状态类
每一个类封装了一个状态对应的行为。‘

三、实现
1、抽象状态类
/**
* @interfaceName State
* @Description 抽象状态类
* @Author xwd
* @Date 2018/10/28 17:42
*/
public interface State {
/**
* @MethodName toState
* @Descrition 转换到这种状态
* @Param []
* @return void
*/
void toState();
}
2、具体状态类
/**
* @ClassName FreeState
* @Description 具体状态类:空闲
* @Author xwd
* @Date 2018/10/28 17:43
*/
public class FreeState implements State{
@Override
public void toState() {
System.out.println("房间已空闲!");
}
}
/**
* @ClassName FreeState
* @Description 具体状态类:已预定
* @Author xwd
* @Date 2018/10/28 17:43
*/
public class BookState implements State{
@Override
public void toState() {
System.out.println("房间已预定!");
}
}
/**
* @ClassName FreeState
* @Description 具体状态类:已入住
* @Author xwd
* @Date 2018/10/28 17:43
*/
public class CheckedState implements State{
@Override
public void toState() {
System.out.println("房间已入住!");
}
}
3、环境类:管理状态
/**
* @ClassName RoomManager
* @Description 环境类:房间管理员
* @Author xwd
* @Date 2018/10/28 17:47
*/
public class RoomManager {
private State state;
public void setState(State state) {
this.state = state;
this.state.toState();
}
}
4、客户
/**
* @ClassName Client
* @Description
* @Author xwd
* @Date 2018/10/28 16:56
*/
public class Client {
public static void main(String[] args) {
RoomManager rm = new RoomManager();
rm.setState(new FreeState());
}
}
四、总结
1、开发中常见的场景
(1)银行系统中账号状态的管理
(2)OA系统中公文状态的管理
(3)酒店系统中,房间状态的管理
(4)线程对象各状态之间的切换
网友评论