博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
状态模式
阅读量:2432 次
发布时间:2019-05-10

本文共 4543 字,大约阅读时间需要 15 分钟。

 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

  主要解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断 逻辑转移到表示不同状态的

                    一系列类当中,可以把复杂的判断逻辑简化。如果状态判断很简单,就没必要用状态模式。

 适用场景:   
     1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。  
   2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

 

 

/** * 抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。 * */public abstract class State {		// State关联Context,同时Context也依赖State	public abstract void handle(Context context);	}

 

/** * 维护一个具体State子类的实例,这个实例定义当前的状态 * */public class Context {		// 状态	private State state;		// 定义Context的初始状态	public Context(State state){		this.state = state;			}	public State getState() {		return state;	}	public void setState(State state) {		this.state = state;		System.out.println("当前状态是:"+state.getClass().getName());	}		// 对请求做处理,并设置下一状态	public void request(){		state.handle(this);	}}

 

/** * 具体状态A,实现一个与Context的一个状态相关的形为 * */public class ConcreteStateA extends State {	@Override	public void handle(Context context) {		// 设置ConcreteStateA的下一状态是ConcreteStateB		context.setState(new ConcreteStateB());	}}

 

/** * 具体状态B,实现一个与Context的一个状态相关的形为 * */public class ConcreteStateB extends State {	@Override	public void handle(Context context) {		// 设置ConcreteStateB的下一状态是ConcreteStateA		context.setState(new ConcreteStateA());	}}

 

public class Main {	public static void main(String[] args) {				// 设置初始状态		Context context = new Context(new ConcreteStateA());					// 不断的请求,同时更改状态		context.request();		context.request();		context.request();		context.request();	}}

 

输出结果为:

 

当前状态是:com.design.state.ConcreteStateB当前状态是:com.design.state.ConcreteStateA当前状态是:com.design.state.ConcreteStateB当前状态是:com.design.state.ConcreteStateA

 

 

 

状态模式实例(写程序工作状态)

 

 

/** * 抽象工作状态 * */public abstract class State {			// 写程序方法,关联工作类,工作类也依赖于工作状态	public abstract void writeProgram(Work k);}

 

/** * 工作类 * */public class Work {		// 钟点属性,状态转换的依据	private double hour;	// 任务完成属性,是否能下班的依据	private boolean finish;		// 当前状态	private State current;	public Work(State state){		this.current = state;	}		public double getHour() {		return hour;	}	public void setHour(double hour) {		this.hour = hour;	}	public boolean isFinish() {		return finish;	}	public void setFinish(boolean finish) {		this.finish = finish;	}	public State getCurrent() {		return current;	}	public void setCurrent(State current) {		this.current = current;	}		public void writeProgam(){		this.current.writeProgram(this);	}	}

 

/** * 上午工作状态 * */public class FroenoonState extends State{	@Override	public void writeProgram(Work w) {				if(w.getHour()<12){			System.out.println("当前时间:"+w.getHour()+"点,上午工作,精神百倍。");		}		else{			// 超过12点,转入中午工作状态			w.setCurrent(new NoonState());			w.writeProgam();		}		}}

 

/** * 中午工作状态 * */public class NoonState extends State{	@Override	public void writeProgram(Work w) {				if(w.getHour()<13){			System.out.println("当前时间:"+w.getHour()+"点,饿了,午饭,犯困,午休。");		}		else{			// 超过13点,转入下午工作状态			w.setCurrent(new AfterNoonState());			w.writeProgam();		}		}}

 

/** * 下午工作状态 * */public class AfterNoonState extends State{	@Override	public void writeProgram(Work w) {				if(w.getHour()<17){			System.out.println("当前时间:"+w.getHour()+"点,下午状态还不错,继续努力。");		}		else{			// 超过17点,转入傍晚工作状态			w.setCurrent(new EveningNoonState());			w.writeProgam();		}		}}

 

/** * 下班休息状态 * */public class ResetState extends State{	@Override	public void writeProgram(Work w) {					System.out.println("当前时间:"+w.getHour()+"点,下班回家了。");			}}

 

/** * 晚间工作状态 * */public class EveningNoonState extends State{	@Override	public void writeProgram(Work w) {				// 如果完成任务,转入下班状态		if(w.isFinish()){			w.setCurrent(new ResetState());			w.writeProgam();		}else{			if(w.getHour()<21){				System.out.println("当前时间:"+w.getHour()+"点,加班哦,疲累之级。");							}			else{				// 超过21点,转入睡眠工作状态				w.setCurrent(new SleepingState());				w.writeProgam();			}			}	}}

 

/** * 睡眠状态 * */public class SleepingState extends State{	@Override	public void writeProgram(Work w) {					System.out.println("当前时间:"+w.getHour()+"点不行了,睡着了。");			}}

 

public class Main {	public static void main(String[] args) {		// 项目(初始工作状态-上午工作状态)		Work work = new Work(new FroenoonState());		work.setHour(9);		work.writeProgam();		work.setHour(10);		work.writeProgam();		work.setHour(12);		work.writeProgam();		work.setHour(13);		work.writeProgam();				work.setHour(17);		//work.setFinish(true);		work.setFinish(false);		work.writeProgam();		// 如果员工必须在20点之前离开公司,只需要增加一个"强制下班状态",		// 并改动"傍晚工作状态"类的判断就可以了。		work.setHour(19);		work.writeProgam();		work.setHour(22);		work.writeProgam();	}}

 

 

输出结果如下:

 

当前时间:9.0点,上午工作,精神百倍。当前时间:10.0点,上午工作,精神百倍。当前时间:12.0点,饿了,午饭,犯困,午休。当前时间:13.0点,下午状态还不错,继续努力。当前时间:17.0点,加班哦,疲累之级。当前时间:19.0点,加班哦,疲累之级。当前时间:22.0点不行了,睡着了。

 

转载地址:http://myxmb.baihongyu.com/

你可能感兴趣的文章
缓存思想分析
查看>>
一致性hash
查看>>
J.U.C之ConcurrentHashMap分析
查看>>
J.U.C之CopyOnWriteArrayList
查看>>
J.U.C之Atomic&CAS
查看>>
常用js
查看>>
类的生命周期
查看>>
Joda-Time学习
查看>>
Guava扩展工具包
查看>>
Jedis分片策略-一致性Hash
查看>>
BeanFactory和FactoryBean
查看>>
用户态和内核态的概念区别
查看>>
情境领导力
查看>>
赋能:打造应对不确定性的敏捷组织
查看>>
Java 学习方法浅谈
查看>>
Jsp连接数据库大全
查看>>
WebSphere Application Server 常见问题及解答:安全
查看>>
WebSphere Application Server 常见问题及解答:集群
查看>>
使用 SIBus JMS 提供者
查看>>
调试 SCA 调用
查看>>