HIT 軟體構造 Lab3之State模式

2021-10-07 04:54:36 字數 2526 閱讀 1953

趕在深夜將之前實驗三中涉及到的狀態模式記錄下來,也當做是複習了。

本部落格主要從三個角度來考慮。

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中選一,鼓勵完成更多的應用場景 行星系統 原子系統 社交網路 分析你所選定的多個應用場景的異同,理解需求 它們在哪些方面有共性 哪些方面有差異。他們都具有軌道,中心物體,軌道物體等屬性,但是各自具體...