定義
允許對象在內(nèi)部轉(zhuǎn)態(tài)改變時改變它的行為朝氓,對象看起來好像修改了它的類斯嚎。
使用場景
- 對象的行為取決于它的狀態(tài),并且它會在運行時根據(jù)狀態(tài)改變行為
- 大量的操作會引入很多依賴對象狀態(tài)的條件語句踪危,對象的狀態(tài)可由一個或多個枚舉常量表示堕虹,并且許多操作通常包含相同的條件結(jié)構(gòu)。 狀態(tài)模式將每個條件分支放在單獨的類中虱黄。 這使我們可以將對象的狀態(tài)視為一個對象悦即,而且此對象可以獨立于其他對象進行變化。
例子
如下是一個糖果販賣機的狀態(tài)轉(zhuǎn)換圖橱乱,投入0.25元轉(zhuǎn)動曲柄可以獲得糖果辜梳。
Paste_Image.png
首先定義各種狀態(tài),并且實現(xiàn)各種狀態(tài)的方法泳叠,如投幣冗美、拿回幣、轉(zhuǎn)動曲柄析二、分發(fā)糖果;有些狀態(tài)的方法其實是無效的:
public interface State{
public void insertQuarter();
public void ejectQuarter();
public void turnCrank();
public void dispense();
}
// 投入硬幣的狀態(tài)
public class HasQuarterState implements State{
GumballMachine gumballMachine;
public HasQuarterState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
public void insertQuarter(){
System.out.println("You can not insert another quarter");
}
public void ejectQuarter(){
System.out.println("Quarter returned");
gumballMachine.setState(gumballMachine.getNoQuarterState());
}
public void turnCrank(){ // 搖動曲柄
System.out.println("You turned...");
gumballMachine.setState(gumballMachine.getSoldState());
}
public void dispense(){
System.out.println(" No gumball dispensed");
}
}
// 轉(zhuǎn)動曲柄 銷售狀態(tài)
public class SoldState implements State{
GumballMachine gumballMachine;
public SoldState(GumballMachine gumballMachine){
this.gumballMachine = gumballMachine;
}
public void insertQuarter(){
System.out.println("Please wait, we are already giving you a gumball");
}
public void ejectQuarter(){
System.out.println("Sorry, you have turned the crank");
}
public void turnCrank(){ // 搖動曲柄
System.out.println("Turing twice doesn't get you another gumball");
}
public void dispense(){
gumballMachine.releaseBall();
if(gumballMachine.getCount() > 0){
gumballMachine.setState(gumballMachine.getNoQuarterState());
}else{
System.out.println("out of gumballs");
gumballMachine.setState(gumballMachine.getSoldOutState());
}
}
}
// NoQuarterState SoldOutState
糖果機的實現(xiàn):
public class GumballMachine{
State soldOutState;
State noQuarterState;
State hasQuarterState;
State soldState;
State state = soldState;
int count = 0;
public GumballMachine(int numberGumballs){
soldOutState = new SoldOutState(this);
noQuarterState = new NoQuarterState(this);
hasQuarterState = new HasQuarterState(this);
soldState = new SoldState(this);
this.count = numberGumballs;
if(numberGumballs > 0){
state = noQuarterState;
}
}
public void insertQuarter(){
state.insertQuarter();
}
public void ejectQuarter(){
state.ejectQuarter();
}
public void turnCrank(){
state.turnCrank();
state.dispense();
}
void setState(State state){
this.state = state;
}
void releaseBall(){
System.out.println("A gumball comes rolling out the slot...");
if(count !=0 ){
count = count-1;
}
}
// getNoQuarterState等各種getter
}
分析
狀態(tài)模式:封裝基于狀態(tài)的行為节预,并將行為委托到當前狀態(tài)叶摄。
策略模式:將可以互換的行為封裝起來,然后使用委托的方法決定使用哪一個行為