设计模式(20)--状态模式

状态模式,事物都是不断在演变,面向对象是对现实世界的抽象,所以对象某些时候也会发生状态改变,为了容易处理这些状态发生改变的的这些对象,诞生了状态模式。

状态模式即系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不同时可以使用状态模式。

状态模式将发生改变的状态抽象出来形成一个状态类,便于进行处理。

状态模式UML类图:


示例代码:

环境类:

/*****
 * 环境类,其中某些状态发生改变,抽象出来形成状态类(在本例中为季节类)
 * 环境类其实才是真正拥有状态的对象
 * @author wjw
 *
 */
public class Context {

	private State state;//维持一个状态引用
	private int temperature;//温度属性
	
	
	public Context(){
		//初始化为春季状态
		state = new SpringState(this);
	}
	
	public void setState(State state){
		this.state = state;
	}
	/****
	 * 环境温度改变
	 */
	public void changeTemperature(){
		state.changeTemperature();
	}
}

抽象季节状态类:

/*****
 * 抽象状态类,专门用于封装发生改变的状态
 * @author wjw
 *
 */
public abstract class State {
	protected Context context;
	protected State(Context context){
		this.context = context;
	}
	public abstract void changeTemperature();//温度改变

}

春夏秋冬四季具体状态类:

/****
 * 春季状态类
 * @author wjw
 *
 */
public class SpringState extends State{

	protected SpringState(Context context) {
		
		super(context);
		System.out.println("来到了春季,万物复苏的季节!");
		// TODO Auto-generated constructor stub
	}


	@Override
	public void changeTemperature() {
		// TODO Auto-generated method stub
		context.setState(new SummerState(context));
	}



}

/****
 * 夏季状态类
 * @author wjw
 *
 */
public class SummerState extends State{

	protected SummerState(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		System.out.println("来到了夏季,骄阳似火的季节!");
	}

	@Override
	public void changeTemperature() {
		// TODO Auto-generated method stub
		context.setState(new AutumnState(context));
	}



}


/*****
 * 秋季状态类
 * @author wjw
 *
 */
public class AutumnState extends State{

	protected AutumnState(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		System.out.println("来到了秋季,硕果累累的季节!");
	}

	@Override
	public void changeTemperature() {
		// TODO Auto-generated method stub
		context.setState(new WinterState(context));
	}


}

/****
 * 冬季状态类
 * @author wjw
 *
 */
public class WinterState extends State{

	protected WinterState(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		System.out.println("来到了冬季,白雪皑皑的季节!");
	}

	@Override
	public void changeTemperature() {
		// TODO Auto-generated method stub
		context.setState(new SpringState(context));
	}

}


Main类:

public class Main {

	public static void main(String[] args) {
		Context context = new Context();//new一个环境对象,初始化环境为夏季
		context.changeTemperature();//温度改变,季节改变
		context.changeTemperature();//温度改变,季节改变
		context.changeTemperature();//温度改变,季节改变
		context.changeTemperature();//温度改变,季节改变
	}
}


运行结果:

来到了春季,万物复苏的季节!
来到了夏季,骄阳似火的季节!
来到了秋季,硕果累累的季节!
来到了冬季,白雪皑皑的季节!
来到了春季,万物复苏的季节!


说明:

以上实例模拟了温度改变引起的环境类中季节状态的变化。上面例子不难理解,主要在真正运用的时候能将复杂对象的状态类抽象出来。

状态模式:就是将某个复杂环境类中变化的状态抽象出来,便于灵活处理,使系统容易扩展且理解简单。

如有错误,欢迎指正

end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值