【设计模式】状态模式(行为型)

 状态模式

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

 适用性 

    1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
    2.一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。
      这个状态通常用一个或多个枚举常量表示。
      通常,有多个操作包含这一相同的条件结构。
      State模式将每一个条件分支放入一个独立的类中。
      这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
结构类:
 
headfirst结构类
 
系统结构图:
 
---------
具体状态
---------
 
public class HasQuarterState implements State { GumballMachine gumballMachine=null; public HasQuarterState(GumballMachine gumballMachine ){ this.gumballMachine =gumballMachine ; } @Override public void insertQuarter() { System.out.println("已经有钱了"); } @Override public void ejectQuarter() { System.out.println("退钱给你"); this.gumballMachine.setState(gumballMachine.getNoQuarterState()); } @Override public void turnCrank() { System.out.println("你转了按钮"); gumballMachine.setState(gumballMachine.getSoldState()); } @Override public void dispense() { System.out.println("没有机器"); } }
public class NoQuarterState implements State{
	private GumballMachine g=null;
	public NoQuarterState(){
		
	}
	public NoQuarterState(GumballMachine gumballMachine) {
		// TODO Auto-generated constructor stub
		this.g=gumballMachine;
	}
	@Override
	public void insertQuarter() {
		// TODO Auto-generated method stub
		System.out.println("你插入了一个糖果");
		g.setState(g.getHasQuarterState());
	}
	@Override
	public void ejectQuarter() {
		// TODO Auto-generated method stub
		System.out.println("请插入钱");
	}
	@Override
	public void turnCrank() {
		// TODO Auto-generated method stub
		System.out.println("请插入钱");
	}
	@Override
	public void dispense() {
		// TODO Auto-generated method stub
	System.out.println("先给钱 ");	
	}
}

 

public class SoldOutState implements State{
	private GumballMachine g=null;
	public SoldOutState(GumballMachine gumballMachine) {
		// TODO Auto-generated constructor stub
		this.g=gumballMachine;
	}
	@Override
	public void insertQuarter() {
		// TODO Auto-generated method stub
		System.out.println("卖完了");
		g.setState(g.getSoldOutState());
	}
	@Override
	public void ejectQuarter() {
		// TODO Auto-generated method stub
		System.out.println("请插入钱");
	}
	@Override
	public void turnCrank() {
		System.out.println("没有糖果了");
	}
	@Override
	public void dispense() {
		// TODO Auto-generated method stub
		System.out.println("没有糖果了");
	}
}
public class SoldState implements State{
	private GumballMachine g=null;
	public SoldState(GumballMachine gumballMachine) {
		// TODO Auto-generated constructor stub
		this.g=gumballMachine;
	}
	@Override
	public void insertQuarter() {
		// TODO Auto-generated method stub
		System.out.println("等一下 正在出糖果");
	}
	@Override
	public void ejectQuarter() {
		// TODO Auto-generated method stub
		System.out.println("很抱歉 你已经按了按钮");
	}


	@Override
	public void turnCrank() {
		// TODO Auto-generated method stub
		System.out.println("请等待,正在出售");
	}
	@Override
	public void dispense() {
		// TODO Auto-generated method stub
		g.releseBall();
		if(g.getCount()>0){
			g.setState(g.getNoQuarterState());
		}else{
			System.out.println("卖完了");
			g.setState(g.getSoldOutState());
		}
	}
}

 

---------

 

上下文
--------
 
/** * 糖果机 * * @author Administrator */ public class GumballMachine { int count = 0; private State hasQuarterState = null; private State noQuarterState = null; private State soldOutState = null; private State soldState = null; State state = soldOutState; public GumballMachine(int numGumball) { soldState = new SoldState(this); soldOutState = new SoldOutState(this); noQuarterState = new NoQuarterState(this); hasQuarterState = new HasQuarterState(this); if (count > 0) { this.state = noQuarterState; } } public void ejectQuarter() { state.ejectQuarter(); } public int getCount() { return count; } public State getHasQuarterState() { return hasQuarterState; } public State getNoQuarterState() { return noQuarterState; } public State getSoldOutState() { return soldOutState; } public State getSoldState() { return soldState; } public State getState() { return state; } public void insertQuarter() { state.insertQuarter(); } public void releseBall() { if (count != 0) { count--; } } public void setCount(int count) { this.count = count; } public void setHasQuarterState(State hasQuarterState) { this.hasQuarterState = hasQuarterState; } public void setNoQuarterState(State noQuarterState) { this.noQuarterState = noQuarterState; } public void setSoldOutState(State soldOutState) { this.soldOutState = soldOutState; } public void setSoldState(State soldState) { this.soldState = soldState; } public void setState(State state) { this.state = state; } public void turnCrank() { state.turnCrank(); } }
 
-------
抽象状态
----------
 
public interface State { public void insertQuarter(); public void ejectQuarter(); public void turnCrank(); public void dispense(); }
 
------------
测试类
----------
 
public class Te { public static void main(String[] args) { GumballMachine gumballMachine=new GumballMachine(10); gumballMachine.setState(gumballMachine.getHasQuarterState()); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); gumballMachine.insertQuarter(); gumballMachine.turnCrank(); } }
---------
测试结果
------------
已经有钱了
你转了按钮
等一下 正在出糖果
请等待,正在出售
等一下 正在出糖果
请等待,正在出售
-----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值