狀態模式是在程式開發時,經常用到的模式。如果沒有應用過,而實現業務功能。那你也一定是按照狀態模式的路子走的,只不過你沒有感覺到而已。它的實現,是要根據物件的內部狀態變化,而自動執行相應的功能。
費話就不說了,請看一下源**,這也是我研究設計模式時看到的乙個例子,把其翻譯成中文,使個位網友能夠看懂些,由於水平有限,只能達到這樣,還希望網友多指證,也算是抄來的哈哈,謝謝啊。
public class gumballmachine
}
//當把錢投入進來,就會執行這裡
public void insertquarter() else if (state == no_quarter) else if (state == sold_out) else if (state == sold)
}
//現在,如果顧客試著退回25分錢...
public void ejectquarter() else if (state == no_quarter) else if (state == sold) else if (state == sold_out)
}
//顧客試著轉動手柄...
public void turncrank() else if (state == no_quarter) else if (state == sold_out) else if (state == has_quarter)
}
//發放糖果
public void dispense() else
} else if (state == no_quarter) else if (state == sold_out) else if (state == has_quarter)
}
}
測試就來自已寫吧,我提供個思路,就是頁面提供幾個開關,即按紐、checkbox等在它們的單擊事件上gumballmachine例項的內部狀態改變。然後看其變化,就可以了。
大家看沒看出來,這段**還有一些「怪的味道」呀,這時如果業務變化了,如果客戶是乙個中獎的使用者,需要糖果機吐出兩塊糖果,怎麼辦?,是不是還得在各個方法中把這個狀態給加上呀,又得加乙個if語句呢,這是乙個業務發生了變化,如果業務要無限的變化下去,程式設計師是不是都要瘋了,哈哈。所以要對其進行重構了。
要把這幾個狀態抽象出來。想到這裡看一下**就明白了。
public inte***ce state
下面是幾個實現這個狀態介面的實現類。
public class hasquarterstate implements state
public void insertquarter()
public void ejectquarter()
public void turncrank() else
}
public void dispense()
}public class noquarterstate implements state
// 分發物品
public void dispense()
// 退錢
public void ejectquarter()
// 投錢
public void insertquarter()
// 按紐操作
public void turncrank()
}public class soldoutstate implements state
public void dispense()
public void ejectquarter()
public void insertquarter()
public void turncrank()
}public class soldstate implements state
//以下3個方法對此狀態來說都是不恰當的
public void insertquarter()
public void ejectquarter()
public void turncrank()
//首先讓機器發放糖果
public void dispense() else
}
}public class winnerstate implements state
public void insertquarter()
public void ejectquarter()
public void turncrank()
//我們在這裡發放出2顆糖果,然後進入noquarterstate或soldstate
public void dispense() else else
}
}
}
下面是新的糖果類:
public class gumballmachinetwo
}
//委託給當前狀態
public void insertquarter()
public void ejectquarter()
//dispense()是乙個內部動作方法,使用者不可以直接要求機器發放糖果
public void turncrank()
//允許其他的物件將機器狀態轉換到不同的狀態
void setstate(state state)
//輔助方法釋放出糖果,並將count例項變數值減1
void releaseball()
}
int getcount()
void refill(int count)
public state getstate()
public state getsoldoutstate()
public state getnoquarterstate()
public state gethasquarterstate()
public state getsoldstate()
public state getwinnerstate()
}
設計模式之State模式
state模式類似於switch的多路分鐘功能 狀態模式的ulm圖 狀態模式用於改變目標物件的行為方式,隨著狀態變化目標程式從乙個轉到另乙個目標程式。package state public class creature private class forg implements state pri...
設計模式之state模式
狀態模式 state pattern 允許乙個物件在其內部狀態改變時改變它的行為。適用場景 一 乙個物件的行為取決於他的狀態,並且它必須在執行時根據狀態改變它 的行為 二 乙個操作中含有龐大的多分支條件語句,並且這些分支依賴於該物件的 狀態。優缺點 狀態模式的主要優點在於封裝了轉換規則,其缺點在於使...
SIP之設計模式 State設計模式
學過設計模式和沒接觸過c 的就不要往下看了。設計模式可能計算機系的同學都學過,不過我用得最多的可能是下面幾種 1.singleton 2.factory 3.strategy 因為這三個我覺得最簡單和使用.但 我的sip是要用狀態機的,所以決定用state設計模式.state模式對我們的sip有什麼...