設計模式之 十七 狀態模式State

2021-05-27 08:16:40 字數 1727 閱讀 5190

由簡單的開始會比較好理解狀態模式的作用,先來看乙個例子,如果您有乙個只能順時針轉動的瓦斯開關,轉動一次的狀態為off、 small fire、medium fire與large fire,您如何在程式中控制狀態的變化與行為呢?乙個最簡單的方式就是用if..else或是switch流程來控制,例如:

這個方法很簡單,每個人都會,但如果您的狀態變化並不是流水式的變化,而是像tcp連線狀態一樣,會是乙個網路圖的時候,用 if...else或switch來寫的話,您的程式就會亂的不像話了;來考慮如何讓物件控制自己的狀態轉換與所應表現的行為,這個程式可以這 樣改寫:

public class mediumstate implements istate  

}

public class largestate implements istate  

}

public class fireswitch 

public void setstate(state s)

public void switchfire()

}

public class main  

}

程式執行結果與上乙個例子是一樣的,但這次並沒有用流程控制來進行狀態轉換,而由物件自行控制自己的狀態,與必須表現的行為,這個方式就是state 模式,將這個例子的 uml 類別結構畫出就如下所示:

再進一步考慮開關可以順時針與逆時針轉動,這時如果您仍以if...else或switch來寫,就會讓流程顯示複雜,來看看如何使用狀態模式來撰 寫: 

public inte***ce istate

public class offstate implements istate 

public void switchcountclock(fireswitch sw)

}

public class smallstate implements istate  

public void switchcountclock(fireswitch sw)

}

public class mediumstate implements istate 

public void switchcountclock(fireswitch sw)

}

public class largestate implements state 

public void switchcountclock(fireswitch sw)

}

public class fireswitch 

public void setstate(state s)

public void switchclockwise()

public void switchcountclock()

}

public class main  

}

接下來您可以任意的轉動開關了,無論是順時針轉動或是逆時針轉動,狀態的轉換都由物件自己來表現,這是雙向狀態轉換下的例子, 如果乙個狀態可能轉換至三個以上的狀態,使用state模式就更可以看出它的好處了,就像gof的tcp連線例子一樣,如果您了解tcp連線,可以看看原 書是如何實現tcp連線之間的狀態轉換的。 

state模式的uml結構圖如下: 

**

設計模式之狀態模式

一 作用 允許乙個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類。其別名為狀態物件 objects for states 狀態模式是一種物件行為型模式。二 例子 狀態抽象類 abstract class state 具體狀態類,每個狀態對應乙個類 class concretestat...

設計模式之 狀態模式

gof 設計模式 中給狀態模式下的定義為 允許乙個物件在其內部狀態改變時改變它 的行為。這個物件看起來似乎修改了它的類。看起來,狀態模式好像是神通廣大 居然能夠 修改自身的類 能夠讓程式根據不同的外部情況來做出不同的響應,最直接的方法就是在程式中將這些可能發生的外部情況全部考慮到,使用 if els...

設計模式之狀態模式

定義 允許乙個物件在其內部狀態變化時改變它的行為,物件看起來似乎修改了它所屬的類。類圖 說明 context表示環境類,它定義了客戶應用程式感興趣的介面,並維護乙個concretestate子類的例項,這個例項用於定義當前狀態 state表示抽象狀態類,它定義了乙個介面以封裝與context的乙個特...