模式定义
状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。【DP】
模式结构
![](https://i-blog.csdnimg.cn/blog_migrate/45ce87f31aabb4f12c447e058d798fa3.png)
模式实现
抽象状态
package com.nchu.state;
abstract class State {
public abstract void writeProgram(Work w);
}
上午工作
package com.nchu.state;
/**
* 上午工作状态
* @author acer
*
*/
public class ForenoonState extends State {
public void writeProgram(Work w) {
if(w.getHour() < 12){
System.out.println("当前时间:" + w.getHour() + "点, 上午工作,精神百倍!");
}else{
w.setState(new NooState());
w.WriteProgram();
}
}
}
中午工作
package com.nchu.state;
public class NooState extends State{
@Override
public void writeProgram(Work w) {
if(w.getHour() < 13){
System.out.println("当前时间," + w.getHour() + "点, 饿了, 午饭。犯困, 午休!");
}else{
w.setState(new AfternoonState());
w.WriteProgram();
}
}
}
下午工作
package com.nchu.state;
public class AfternoonState extends State {
public void writeProgram(Work w) {
if(w.getHour() < 17){
System.out.println("当前时间:" + w.getHour() + "点,下午状态还不错,继续努力!");
}else{
w.setState(new EveningState());
w.WriteProgram();
}
}
}
晚间工作
package com.nchu.state;
public class EveningState extends State {
public void writeProgram(Work w) {
if(w.isTaskFinished()){
w.setState(new RestState());
w.WriteProgram();
}else{
if(w.getHour() < 21){
System.out.println("当前时间:" + w.getHour() + "点, 加班哦,疲惫至极!");
}else{
w.setState(new SleepingState());
w.WriteProgram();
}
}
}
}
睡眠状态
package com.nchu.state;
public class SleepingState extends State{
public void writeProgram(Work w) {
System.out.println("当前时间:" + w.getHour() + "点,睡不着。");
}
}
下班休息状态
package com.nchu.state;
public class RestState extends State {
public void writeProgram(Work w) {
System.out.println("当前时间:" + w.getHour() + "点,下班回家!");
}
}
工作类
package com.nchu.state;
public class Work {
private State state;
public Work() {
state = new ForenoonState();
}
private double hour;
public double getHour() {
return hour;
}
public void setHour(double hour) {
this.hour = hour;
}
private boolean taskFinished;
public boolean isTaskFinished() {
return taskFinished;
}
public void setTaskFinished(boolean taskFinished) {
this.taskFinished = taskFinished;
}
public void setState(State state) {
this.state = state;
}
public void WriteProgram(){
state.writeProgram(this);
}
}
测试类
package com.nchu.state;
public class Client {
public static void main(String[] args) {
Work emegentcyProjects = new Work();
emegentcyProjects.setHour(9);
emegentcyProjects.WriteProgram();
emegentcyProjects.setHour(10);
emegentcyProjects.WriteProgram();
emegentcyProjects.setHour(12);
emegentcyProjects.WriteProgram();
emegentcyProjects.setHour(13);
emegentcyProjects.WriteProgram();
emegentcyProjects.setHour(14);
emegentcyProjects.WriteProgram();
emegentcyProjects.setHour(17);
emegentcyProjects.WriteProgram();
// emegentcyProjects.setTaskFinished(true);
emegentcyProjects.setTaskFinished(false);
emegentcyProjects.setHour(19);
emegentcyProjects.WriteProgram();
emegentcyProjects.setHour(22);
emegentcyProjects.WriteProgram();
}
}
使用场景
当一个对象的行为取决于他的状态,并且它必须在运行时刻根据状态改变他的行为时,就可以考虑用状态模式。
模式优缺点
优点
1、将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。
2、由于所有与状态相关的代码都存放在于某个ConcreteState中,所以添加新的子类可以很容易的添加新的状态和转换。
3、状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。
缺点
状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。模式总结
1、状态模式允许一个对象基于内部状态而拥有不同的行为。
2、ConcreteState会将行为委托给当前状态对象。
3、状态模式对“开闭原则”支持不是很好。