設計模式之命令(State)模式

2021-08-29 12:57:58 字數 3271 閱讀 7463

狀態模式是在程式開發時,經常用到的模式。如果沒有應用過,而實現業務功能。那你也一定是按照狀態模式的路子走的,只不過你沒有感覺到而已。它的實現,是要根據物件的內部狀態變化,而自動執行相應的功能。

費話就不說了,請看一下源**,這也是我研究設計模式時看到的乙個例子,把其翻譯成中文,使個位網友能夠看懂些,由於水平有限,只能達到這樣,還希望網友多指證,也算是抄來的哈哈,謝謝啊。

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有什麼...