趕在深夜將之前實驗三中涉及到的狀態模式記錄下來,也當做是複習了。
本部落格主要從三個角度來考慮。
1.什麼是state模式?
2.為什麼用state模式?
3.如何使用state模式?
簡要的介紹來說state模式就是:不同的狀態,不同的行為。
也就是允許乙個物件,當其內部狀態改變時,改變其行為的方式。
如上圖所示,航班在wait狀態下,可以給其分配飛機資源,指定該航班當前有哪些飛機。
當航班在allocate狀態下,表示當前航班有飛機,那麼可以起飛,取消等等。
當航班在run狀態下,表示當前航班的飛機已經起飛,那麼只能進行降落。
這裡採用的就是不同狀態下不同的方法,需要注意的是,每個狀態下的方法是特有的,例如:wait狀態下不能夠起飛,因為沒有被分配飛機。
在實際程式設計中,我們會經常使用if…else等語句進行條件的判斷,不同的條件下執行不同的語句,這些語句使用起來很是方便。
但是,如果針對狀態的這樣判斷切換反覆出現,我們就要聯想到是否可以採取state模式了.
必須要使用state模式嗎?答案是否定的,但是回到了**的可維護性、可擴充套件性、可復用性等諸多層面考慮。就拿實驗3的內容來舉例。
我們針對計畫項設定了不同的狀態,不論那個計畫項都有下面幾種狀態:waiting,allocated,running,ended,cancelled
這五種狀態是計畫項共有的,暫且不考慮特殊的狀態,我們在實驗3中要實現3種計畫項。每種計畫項至少包含上面五種狀態,如果不採用state模式,我們就得採用if…else語句,或者switch語句,進行狀態判斷,語句執行。這樣會使用很多的**。
針對不同的計畫項,我們還要拷貝**,讓三種計畫項都有狀態的操作,這無疑造成了**複雜,重複,又造成了**的重複。
如果我們想要對某個狀態的操作進行改動,就需要對所有計畫項的**都進行改動,這樣**可復用性,可維護性都不好。
針對這種情況,我們就可以採用狀態設計模式,定義不同的狀態子類,在每個子類下定義相關的操作。
同時,定義乙個狀態轉換的開關,幫助我們進行狀態的切換操作。
下面主要介紹下本次實驗的state模式的應用設計
public class entrystate
/*** constructor
* * @param s string,the state's name and must be waiting
*/public entrystate(string s)
/** * set the entry's state
* @param state
*/ public void setstate(state state)
/*** observer,get the entry's state
* @return state
*/public state getstate()
/** * change the state to allocated
* @param type is the entry's type
*/ public void allocat(string type)
/*** change the state to running
* @param type is the entry's type
*/public void run(string type)
/*** change the state to blocked
* @param type is the entry's type
*/public void block(string type)
/*** change the state to cancelled
* @param type is the entry's type
*/public void cancel(string type)
/*** change the state to ended
* @param type is the entry's type
*/public void end(string type)
@override
public boolean equals(object obj)
return false;
}}
entrystate類實際上就是切換的開關,state類就是切換的狀態的子類,在每個state類中都有不同的操作。
在entrystate類中,提供了set方法,用來切換state類,達到狀態的切換。
state模式採用簡潔的**通過介面,抽象類等方式,抽象狀態為類,然後通過乙個狀態切換開關去切換狀態,執行不同的操作。對於每種狀態又委託控制狀態的邏輯進行修改和操作,實現起來非常簡潔。
採用這個模式,就需要程式設計人員提取出不同狀態,以及同意狀態下的相同操作(共性),讓問題簡單化。
軟體構造 Lab3
遇到的一些問題 按鈕 覆寫 由於我的gui的實現是由乙個基礎類和三個子類組成,其中基礎類的一些按鈕的 實現要在子類中覆寫,但是我一直找不到好的方法去覆寫,所以我直接在子類中遍歷了該按鈕的所有 把它們都刪了然後重加 正規表示式匹配 在這個實驗裡我發現了正規表示式的乙個好用的功能,比如在匹配如下資訊時 ...
軟體構造Lab3實驗總結
本次實驗是軟體構造課程當中工作量最大,且最為複雜的乙個。主要工作是實現乙個多軌道系統,在這個系統的基礎上完成三個應用。track game atom structure social network circle 三種應用都具有一定的多軌道結構。track game 中的軌道是跑道,atom str...
哈工大軟體構造lab3
3.1 待開發的三個應用場景 首先請列出你要完成的具體應用場景 至少3個,1和2中選一,3必選,4和5中選一,鼓勵完成更多的應用場景 行星系統 原子系統 社交網路 分析你所選定的多個應用場景的異同,理解需求 它們在哪些方面有共性 哪些方面有差異。他們都具有軌道,中心物體,軌道物體等屬性,但是各自具體...