-- 状态(State)模式,允许通过改变对象的内部状态而改变对象的行为。
一、模式结构
引用官方结构图:
组成(角色) | 作用 |
---|---|
Context (用户对象) | 有State状态的引用。 |
State (状态抽象类) | 提供状态行为的抽象 |
ConcreteState (具体状态) | 实现具体行为 |
这里有多种实现方法,我们可以实现成对OCP(开闭原则)比较友好的,也可以实现成可读性友好的……
二、栗子 《用户在线与离线》
- 这里实现第二种(可读性较高,但不适用OCP)
1、状态抽象类
package com.behavior.state;
/**
* @description: 状态
* @author: ziHeng
* @create: 2018-08-15 14:58
**/
public interface State {
void handle(Man man);
}
2、具体状态行为
(1)、在线行为 - (用户上线次数加一)
package com.behavior.state;
/**
* @description: 状态:在线
* @author: ziHeng
* @create: 2018-08-15 15:00
**/
public class OnlineState implements State{
@Override
public void handle(Man man) {
//上线次数加一
int onlineNum = man.getOnlineNum();
man.setOnlineNum(++onlineNum);
System.out.println(man.getName()+" - 在线中");
}
}
(2)、离线行为
package com.behavior.state;
/**
* @description: 状态:离线
* @author: ziHeng
* @create: 2018-08-15 15:00
**/
public class OffLineState implements State{
@Override
public void handle(Man man) {
System.out.println(man.getName()+" - 离线中");
}
}
3、用户
package com.behavior.state;
import lombok.Data;
/**
* @description: 人
* @author: ziHeng
* @create: 2018-08-15 15:07
**/
@Data
public class Man {
private String name;
//上线次数
private int onlineNum;
private String status;
//状态抽象类,具体行为
private State state;
public Man(String name) {
this.onlineNum = 0;
this.name = name;
//初始状态为离线
this.state = new OffLineState();
}
//改变状态 - 每次增加新的状态行为的都要重新修改此处代码
public void setStatus(String status) {
if("on".equals(status)){
state = new OnlineState();
}else if("off".equals(status)){
state = new OffLineState();
}else {
System.out.println("没有该变化的状态处理类:"+status+" 默认为离线");
state = new OffLineState();
}
state.handle(this);
}
}
调用Test:
package com.behavior.state;
/**
* @description: 状态模式
* @author: ziHeng
* @create: 2018-08-15 14:33
**/
public class StateTest {
public static void main(String[] args) {
Man man = new Man("张三");
//第一次上线
man.setStatus("on");
//下线
man.setStatus("off");
//又上线
man.setStatus("on");
//查看上线次数
System.out.println("用户:"+man.getName()+" 共上线"+man.getOnlineNum()+"次");
}
}