淺學設計模式之狀態模式 (8 23)

2021-09-25 04:28:31 字數 2026 閱讀 7113

狀態模式(state),當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類

狀態模式是對乙個物件所處的狀態作分析。在不同的狀態下表現不同的行為。

狀態模式就是對不同狀態的行為進行解耦。

這裡還是舉大話設計模式的例子。

就拿乙個人一天工作的行為來說吧,這個人一天有五種狀態,上午、中午、下午、傍晚、晚上各一種。 然後又有個引數是 是否完成工作,如果完成工作,怎晚上能回家,否則晚上要上班。

我們編寫乙個工作狀態類:

public

class

personstate

public

void

settaskfinished

(boolean taskfinished)

public

void

work()

else

if(hour <13)

else

if(hour <17)

else

else

else}}

}}

根據狀態來執行不同的行為,然後我們在main函式的**如下:

雖然功能是完成了,但是其實這樣的**還是有許多漏洞的。

比如我們加乙個需求,要求就算要加班,21點到了也必須要下班走人,而這個時候更改**就要更改整個work方法,這樣是顯然的違反了開放-封閉原則,而這個類通過if/else分支語句做了很多的事情,其實也是違背了單一職責原則

我們可以通過uml圖來描述一下狀態模式

狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜的情況。把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把複雜的判斷邏輯簡化。

handler()方法是關鍵,通過這個方法可以指向下乙個狀態。

我們先寫乙個模板出來:

首先是state類,它定義了乙個處理狀態的方法

public

abstract

class

state

然後實現這個context類,它裡面維護了乙個state例項:

public

class

context

public

void

setstate

(state state)

public

void

request()

}

然後實現具體的每個狀態類a、b:

public

class

concretestatea

extends

state

}class

concretestateb

extends

state

}

最後客戶端的**如下所示:

public

void

main()

通過執行request()實現了狀態的更新,而且這個**解耦度高,利於擴充套件。

我們將這個uml圖代入到上面那個例子中去。

這樣寫**的可擴充套件度就高了。

具體的**我就不寫了有了這個圖,**還不好寫嗎。

淺學設計模式之裝飾模式 (2 23)

裝飾模式就是動態地給乙個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更加靈活。對於人來說,衣服 鞋子 領帶 襪子等都是裝飾,裝飾模式就是給光著身子的人穿上各種衣服褲子。對於程式物件來說,每乙個功能都是裝飾,給乙個類增加功能,就是給這個類進行裝飾。compoent是乙個物件介面,可以給這...

淺學設計模式之建造者模式 (6 23)

建造者模式 builder 將乙個複雜物件的構建與它的表示分離,是的同樣的構建過程可以建立不同的表示 建造者在android中,至少也是23種設計模式使用頻率能排進前三的模式了吧。因為這個模式太常用了所以我就畫個uml圖和寫寫模板 就好了 建造模式中,主要是builder為乙個建立入口,它可以通過方...

淺學設計模式之外觀模式

外觀模式是軟體工程中常用的一種軟體設計模式。它為子系統中的一組介面提供乙個統一的高層介面。使用子系統更容易使用。下圖是狀態模式的uml圖。facade 這個外觀類為子系統中packages 1 2 3提供乙個共同的對外介面 clients 客戶物件通過乙個外觀介面讀寫子系統中各界面的資料資源。pac...