《Head First Design Patterns》读书笔记之状态模式

    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像改变了他的类.

    这说的有点玄乎,其实就是将一群状态的公共行为封装进一个抽象的状态对象(Status)里,然后通过实现这个抽象类来自定义自己的行为,最重要的一点是,这些行为和状态之间联系也被封装在其中,所以,随着流程的进行,作为拥有这些内部状态的类(Context),它的行为也会自动的游走于各个状态对象,从而实现行为的改变.同为一个Insert方法,由于Status对象的不同,Insert行为也会返回不同的效果.

    有图为证:

  

    上代码:

   

/**
 * @author dean
 * 相当于Context类
 */
public class GumballMachine
{
	Status hasQuartreStatus;
	Status noQuarterStatus;
	Status soldStatus;
	Status soldOutStatus;
	int count = 0; //糖果数目
	
	Status status;
	
	public GumballMachine(int num)
	{
		hasQuartreStatus = new HasQuarterStatus(this);
		noQuarterStatus = new NoquarterStatus(this);
		soldOutStatus = new SoldOutStatus(this);
		soldStatus = new SoldStatus(this);
		this.count = num;
		status = noQuarterStatus;// 初始化状态
	}
	
	public void insertQuarter() {
		status.insertQuarter();
	}

	public void ejectQuarter() {
		status.ejectQuarter();
	}

	public void turnCrack() {
		status.turnCrack();
		status.dispense();
	}

	public void releaseBall()
	{
		if(count>0)
		{
			System.out.println("a gumball is giving...");
			count--;
		}else
		{
			System.out.println("sorry, the gumball is sold out");
		}
	}
	
	public Status getHasQuartreStatus() {
		return hasQuartreStatus;
	}

	public void setHasQuartreStatus(Status hasQuartreStatus) {
		this.hasQuartreStatus = hasQuartreStatus;
	}

	public Status getNoQuarterStatus() {
		return noQuarterStatus;
	}

	public void setNoQUarterStatus(Status noQUarterStatus) {
		this.noQuarterStatus = noQUarterStatus;
	}

	public Status getSoldStatus() {
		return soldStatus;
	}

	public void setSoldStatus(Status soldStatus) {
		this.soldStatus = soldStatus;
	}

	public Status getSoldOutStatus() {
		return soldOutStatus;
	}

	public void setSoldOutStatus(Status soldOutStatus) {
		this.soldOutStatus = soldOutStatus;
	}

	public Status getStatus() {
		return status;
	}

	public void setStatus(Status status) {
		this.status = status;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}
	
}

/**
 * @author dean
 * 状态的抽象类,封装各个状态的公共行为
 */
public interface Status 
{
	// 投入硬币
	public void insertQuarter();
	// 弹出硬币
	public void ejectQuarter();
	// 转动拉杆
	public void turnCrack();
	// 发放
	public void dispense();
	
}

/**
 * @author dean
 * 没有投币的状态
 */
public class NoquarterStatus implements Status
{
	GumballMachine gumballMachine;
	
	public NoquarterStatus(GumballMachine gunballMachine) {
		super();
		this.gumballMachine = gunballMachine;
	}

	@Override
	public void insertQuarter() {
		System.out.println("you have inserted quarters");
		gumballMachine.setStatus(gumballMachine.getHasQuartreStatus());
	}

	@Override
	public void ejectQuarter() {
		System.out.println("please insert quarter first");
	}

	@Override
	public void turnCrack() {
		System.out.println("please insert quarter first");
	}

	@Override
	public void dispense() {
	}
}
/**
 * @author dean 投币之后的状态
 */
public class HasQuarterStatus implements Status {
	GumballMachine gumballMachine;

	public HasQuarterStatus(GumballMachine gunballMachine) {
		this.gumballMachine = gunballMachine;
	}

	@Override
	public void insertQuarter() {
		System.out.println("Don't insert another quarters");
	}

	@Override
	public void ejectQuarter() {
		System.out.println("quarter returns");
		gumballMachine.setStatus(gumballMachine.getNoQuarterStatus());
	}

	@Override
	public void turnCrack() {
		System.out.println("you turned the crack");
		gumballMachine.setStatus(gumballMachine.getSoldStatus());
	}

	@Override
	public void dispense() {
		throw new UnsupportedOperationException();
	}

}
/**
 * @author dean
 * 售出状态
 */
public class SoldStatus implements Status
{
	GumballMachine gumballMachine;
	
	public SoldStatus(GumballMachine gunballMachine) {
		super();
		this.gumballMachine = gunballMachine;
	}

	@Override
	public void insertQuarter() {
		System.out.println("you have inserted quarter,please wait....");
	}

	@Override
	public void ejectQuarter() {
		System.out.println("you have turned the crack...");
	}

	@Override
	public void turnCrack() {
		System.out.println("the gumball is given,It is too late...");
	}

	@Override
	public void dispense() {
		this.gumballMachine.releaseBall();
		if(gumballMachine.getCount()>0)
		{
			gumballMachine.setStatus(gumballMachine.getNoQuarterStatus());
		}else
		{
			gumballMachine.setStatus(gumballMachine.getSoldOutStatus());
		}
	}

}
/**
 * @author dean
 * 罄销状态
 */
public class SoldOutStatus implements Status
{
	GumballMachine gunballMachine;
	
	public SoldOutStatus(GumballMachine gunballMachine) {
		super();
		this.gunballMachine = gunballMachine;
	}

	@Override
	public void insertQuarter() {
		System.out.println("Sorry,the gumball has sold out...");
	}

	@Override
	public void ejectQuarter() {
		System.out.println("Sorry,the gumball has sold out...");
	}

	@Override
	public void turnCrack() {
		System.out.println("Sorry,the gumball has sold out...");
	}

	@Override
	public void dispense() {
		System.out.println("Sorry,the gumball has sold out...");
	}

}
/**
 * @author dean
 * 测试类
 */
public class Test 
{
	public static void main(String[] args) {
		// 
		GumballMachine gumballMachine = new GumballMachine(3);
		gumballMachine.insertQuarter();
		gumballMachine.turnCrack();
		
		System.out.println("=============");
		// 
		gumballMachine.turnCrack();
		
		System.out.println("=============");
		// 
		gumballMachine.insertQuarter();
		gumballMachine.ejectQuarter();
		gumballMachine.turnCrack();
		System.out.println("=============");
		// 
		gumballMachine.insertQuarter();
		gumballMachine.turnCrack();
		System.out.println("=============");
		// 
		gumballMachine.insertQuarter();
		gumballMachine.turnCrack();
		System.out.println("=============");
		// 
		gumballMachine.insertQuarter();
		gumballMachine.turnCrack();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值