状态模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
适用性
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(); } }
---------
测试结果
------------
已经有钱了
你转了按钮
等一下 正在出糖果
请等待,正在出售
等一下 正在出糖果
请等待,正在出售
-----------