初探设计模式——状态模式

状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
State接口(抽象类)定义了一个生成所有具体状态的共同接口,那么实现接口的状态类可以互相转换。
Context类拥有一些状态,通过request()方法请求某状态对象的行为
ConcreteStateA是实现接口的一个具体状态类,提供本状态特有的实现处理来自Context的请求,使得Context改变状态时行为也发生改变。

定义一个State接口,包含了所有状态的方法(抽象类可以减少代码重复)
	public interface State{
		insertQuarter();
		dispense();
	}
封装变化,状态类实现接口,修改封闭,将每个状态的行为放到各自的类中(行为局部化)
实现符合这个状态的行为,某些情况下改变Context状态从而使得Context使用另一个状态实例的方法
	public class NoQuarterState implements State{
		GunballMachine gunMa;
		public NoQuarterState(GUnballMachine gunMa){
			this.gunMa=gunMa;
		}
		public void insertQuarter(){
			//System..
			gunMa.setState(gunMa.getHasQuarterState());	//让Context状态改变
		}
		//其它方法
	}
多用组合,Context委托状态给相应的状态对象,
包含所有的状态实例,某刻只有一个状态
可以加入其他状态类对扩展开放
	public class GumballMachine{
		State noQuarterState;
		//State ..
		
		State state=noQuarterState;	//初始状态
		int count=0;	//一些状态改变的判断条件

		public GumballMachine(int numberGumballs){	//通过初始数量来决定状态
			noQrarterState=new NoQuarter(this);	//为每种状态类创建实例
			//
			this.count=numberGumballs;
			if(count>0){
				state=
			}
		}
	public void insertQuarter(){
   		state.insertQuarter();		//动作不自己实现,委托到了相应状态对象中
    	 }
    	 //其他类似行为

	public void turnGrank(){		//Context的内部动作,通过状态对象进行调用
		state.dispense();
	}

	void setState(State state){	//允许状态对象转换状态
		this.state=state;
	}
	//其他方法,比如改变判断条件,set,get
  
 }

总结:这个模式将状态封装成独立的类,通过简单引用不同的状态对象将动作委托到代表当前状态的对象,行为随内部状态而改变。与策略模式相比,策主动指定组合对象改变行为,状通过状态对象改变行为而又不用使用依赖型的条件判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值