處理物件的多種狀態及其相互轉換——狀態模式(五)
5 使用環境類實現狀態轉換
在狀態模式中實現狀態轉換時,具體狀態類可通過呼叫環境類Context的setState()方法進行狀態的轉換操作,也可以統一由環境類Context來實現狀態的轉換。此時,增加新的具體狀態類可能需要修改其他具體狀態類或者環境類的原始碼,否則系統無法轉換到新增狀態。但是對於客戶端來說,無須關心狀態類,可以為環境類設定預設的狀態類,而將狀態的轉換工作交給具體狀態類或環境類來完成,具體的轉換細節對於客戶端而言是透明的。
在上面的“銀行賬戶狀態轉換”例項中,我們通過具體狀態類來實現狀態的轉換,在每一個具體狀態類中都包含一個stateCheck()方法,在該方法內部實現狀態的轉換,除此之外,我們還可以通過環境類來實現狀態轉換,環境類作為一個狀態管理器,統一實現各種狀態之間的轉換操作。
下面通過一個包含迴圈狀態的簡單例項來說明如何使用環境類實現狀態轉換:
Sunny軟體公司某開發人員欲開發一個螢幕放大鏡工具,其具體功能描述如下: 使用者單擊“放大鏡”按鈕之後螢幕將放大一倍,再點選一次“放大鏡”按鈕螢幕再放大一倍,第三次點選該按鈕後螢幕將還原到預設大小。 |
可以考慮使用狀態模式來設計該螢幕放大鏡工具,我們定義三個螢幕狀態類NormalState、LargerState和LargestState來對應螢幕的三種狀態,分別是正常狀態、二倍放大狀態和四倍放大狀態,螢幕類Screen充當環境類,其結構如圖6所示:
圖6 螢幕放大鏡工具結構圖
本例項核心程式碼如下所示:
//螢幕類
class Screen {
//列舉所有的狀態,currentState表示當前狀態
private State currentState, normalState, largerState, largestState;
public Screen() {
this.normalState = new NormalState(); //建立正常狀態物件
this.largerState = new LargerState(); //建立二倍放大狀態物件
this.largestState = new LargestState(); //建立四倍放大狀態物件
this.currentState = normalState; //設定初始狀態
this.currentState.display();
}
public void setState(State state) {
this.currentState = state;
}
//單擊事件處理方法,封轉了對狀態類中業務方法的呼叫和狀態的轉換
public void onClick() {
if (this.currentState == normalState) {
this.setState(largerState);
this.currentState.display();
}
else if (this.currentState == largerState) {
this.setState(largestState);
this.currentState.display();
}
else if (this.currentState == largestState) {
this.setState(normalState);
this.currentState.display();
}
}
}
//抽象狀態類
abstract class State {
public abstract void display();
}
//正常狀態類
class NormalState extends State{
public void display() {
System.out.println("正常大小!");
}
}
//二倍狀態類
class LargerState extends State{
public void display() {
System.out.println("二倍大小!");
}
}
//四倍狀態類
class LargestState extends State{
public void display() {
System.out.println("四倍大小!");
}
}
在上述程式碼中,所有的狀態轉換操作都由環境類Screen來實現,此時,環境類充當了狀態管理器角色。如果需要增加新的狀態,例如“八倍狀態類”,需要修改環境類,這在一定程度上違背了“開閉原則”,但對其他狀態類沒有任何影響。
編寫如下客戶端程式碼進行測試:
class Client {
public static void main(String args[]) {
Screen screen = new Screen();
screen.onClick();
screen.onClick();
screen.onClick();
}
}
輸出結果如下:
正常大小! 二倍大小! 四倍大小! 正常大小! |
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 處理物件的多種狀態及其相互轉換——狀態模式(四)物件模式
- 處理物件的多種狀態及其相互轉換——狀態模式(一)物件模式
- [ARM] ARM處理器的7種工作模式和2種工作狀態模式
- 程式的狀態與轉換
- 狀態模式模式
- 工作流從無狀態切換到有狀態的好處
- informix CKPT REQ 狀態處理!ORM
- SSH框架之-hibernate 三種狀態的轉換框架
- 【演算法】狀態之美,TCP/IP狀態轉換探索演算法TCP
- 轉載---Dephi狀態模式(State模式)模式
- LINUX netstat連線狀態解析及TCP狀態轉換LinuxTCP
- JavaStatePattern(狀態模式)JavaAST模式
- JS 狀態模式JS模式
- (三)狀態模式模式
- 狀態模式(State)模式
- WebRTC ICE 狀態與提名處理Web
- 淺談iOS中的程式的五種狀態iOS
- React 4 種狀態型別及 N 種狀態管理React型別
- Java執行緒狀態轉換Java執行緒
- 用設計模式去掉沒必要的狀態變數 —— 狀態模式設計模式變數
- Hibernate物件狀態物件
- Vuex 單狀態庫 與 多模組狀態庫Vue
- 5 個處理狀態列的函式函式
- 巧用狀態值處理複雜的 TableViewView
- RAC中unknown 狀態的處理方式
- 程式的3種狀態
- hibernate中po物件的三種狀態分析物件
- 設計模式-狀態模式設計模式
- 設計模式:狀態模式設計模式
- 23種設計模式(七)-狀態設計模式設計模式
- 狀態變化模式模式
- 狀態模式(State pattern)模式
- 17_狀態模式模式
- 五種查詢Internet連線狀態[含IP]的方法 (轉)
- java執行緒的五大狀態,阻塞狀態詳解Java執行緒
- 5種狀況下的HTTP狀態碼HTTP
- Oracle 資料庫的各種狀態和模式Oracle資料庫模式
- Oracle DG資料庫狀態轉換Oracle資料庫