状态模式就是一个实体有多个状态,不同状态的实现是不同的,实体通过状态类来实现操作。缺点就是每个状态要有实现,意味着如果新加状态,代码会有改动,不满足开闭原则
状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。其别名为状态对象(Objects for States),状态模式是一种对象行为型模式。
状态分为开会、工作、休息三个状态
休息时可以去开会、工作
工作可以休息、开会
开会时可以去工作,不能去休息
状态接口及实现
package test2019.mon03.状态模式;
public abstract class State {
public void goMeet(Worker worker) {
System.out.println("好的!"+worker.getName()+"去开会!");
worker.setState(Worker.getState("meet"));
}
public void goWork(Worker worker) {
System.out.println("好的!"+worker.getName()+"去工作!");
worker.setState(Worker.getState("work"));
}
public void goPlay(Worker worker) {
System.out.println("好的!"+worker.getName()+"去休息!");
worker.setState(Worker.getState("play"));
}
}
package test2019.mon03.状态模式;
public class MeetState extends State {
@Override
public void goMeet(Worker worker) {
System.out.println(worker.getName()+"已经在开会");
}
@Override
public void goPlay(Worker worker) {
System.out.println(worker.getName()+"会议期间,不能去休息");
}
}
package test2019.mon03.状态模式;
public class PlayState extends State {
@Override
public void goPlay(Worker worker) {
System.out.println(worker.getName()+"已经在休息了");
}
}
package test2019.mon03.状态模式;
public class WorkState extends State {
@Override
public void goWork(Worker worker) {
System.out.println(worker.getName()+"已经在工作了");
}
}
员工类
package test2019.mon03.状态模式;
public class Worker {
private State state;
private static State workState,playState,meetState;
private String name;
public Worker(String name) {
this.name = name;
workState = new WorkState();
playState = new PlayState();
meetState = new MeetState();
state = playState;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public static State getState(String state) {
if(state.equals("work")) {
return workState;
}
if(state.equals("play")) {
return playState;
}
if(state.equals("meet")) {
return meetState;
}
return null;
}
public void goMeet() {
state.goMeet(this);
}
public void goWork() {
state.goWork(this);
}
public void goPlay() {
state.goPlay(this);
}
}
测试类
package test2019.mon03.状态模式;
public class Test {
public static void main(String[] args) {
Worker ming = new Worker("ming");
ming.goMeet();
ming.goPlay();
ming.goWork();
ming.goPlay();
System.out.println();
Worker uzi = new Worker("uzi");
uzi.goPlay();
uzi.goMeet();
uzi.goWork();
uzi.goPlay();
}
}
结果
好的!ming去开会!
ming会议期间,不能去休息
好的!ming去工作!
好的!ming去休息!
uzi已经在休息了
好的!uzi去开会!
好的!uzi去工作!
好的!uzi去休息!