設計模式(10)狀態模式(講解 應用)

2021-09-19 15:23:10 字數 2412 閱讀 5149

目錄

狀態模式

為什麼使用狀態模式?

應用例項

狀態模式,顧名思義,肯定是和狀態有關,進一步思考,我們在討論的是設計模式,設計模式中的重要原則對變化的進行封裝,順著這個思路去想,那麼是有很多的變化的狀態,然後通過狀態設計模式,來對這些變化的狀態進行封裝,故狀態設計模式。

狀態模式:對於物件內部的狀態,允許其在不同的狀態下,擁有不同的行為,對狀態單獨封裝成類。

和策略模式類似,這裡是將每乙個狀態單獨封裝成類,每個狀態下擁有不同行為。

為什麼要使用狀態模式?通過乙個例子來看,對於一些問題,當我們通過乙個例子將其具體化之後,我們會發現問題處理起來變得簡單,同時理解起來也不會和之前那樣晦澀難懂。通過什麼來舉例子呢?設計到多狀態,不同狀態下各自具有不同行為的東西,而且理解起來相對容易的。最近在地鐵站發現了有個叫5個橙子的投幣榨汁機,我們投幣10元前,我們就可以獲得一杯用5個橙子榨出來的橙汁一杯,如果讓我們設計這套系統,要怎麼設計呢?首先要有的feature,投幣,退幣,出橙子,然後其要有的state有沒有錢幣,10元錢幣,大於10元的錢幣,小於10元的錢幣,橙子售空,還有橙子。動手來寫。

//榨汁機

public class millmachine

//插入錢幣

public void insertmoney()

else if(state == sold_out)

system.out.println("nothing can be bought");

else if(state == sold)

system.out.prinltn("you will get a cup of juice");

}//取出錢幣

public void withdrawmoney()else if(state == no_money)else if(state == sold)else if(state == sold_out)

}//按下榨汁按鈕

public void pressknob()else if(state == sold_out)else if(state == no_money)else if(state == has_money)

}//產生果汁

public void produce()else if(state==sold_out)else if(state==no_money)

else if(state==has_money)}}

根據**,我們可以看出,我們一共擁有四種狀態,分別為有錢,沒錢,售空,未售空。操作有按下榨汁按鈕,插入錢幣,取出錢幣,榨汁,當然榨汁操作並不是我們手動可以觸發的。對於其中相應的方法寫的也比較詳細,各個操作下狀態的轉換,根據上面的**,我們可以看出是很繁瑣的,而且一旦增加狀態,或者是操作,需要我們修改很多的**,靈活性和可擴充套件性很差,現在就到了我們的狀態設計模式大顯身手的時候了。既然是有很多的狀態,不同狀態下相同的操作行為不同,那麼我們就將每一種狀態單獨封裝成類,然後這些狀態分別實現各自不同操作下的行為,這樣我們的榨汁機只需要對幾個狀態物件進行操作就可以了,使得**變得簡潔也方便以後的修改.show the code

public class millmachine 

public void insertmoney()

public void withdrawmoney()

public void pressknob()

public void produce()

public state getnomoneystate()

public void setstate(state state)

}public inte***ce state

public class hasmoneystate implements state

public void insertmoney()

public void withdrawmoney()

public void pressknob()

public void produce()

}

通過這種方式來寫,讓我們的榨汁機類內部的**量變得更加簡潔,針對介面進行程式設計,同時帶來乙個弊端就是使得我們的額外的增加了許多的狀態類,使得我們的**量增加了很多。

android中的乙個應用例項即使context和state之間,有興趣的可以針對原始碼仔細了解,這裡先貼出來。

用番茄鐘計時來寫這篇部落格,用掉4個番茄。第五個也已經完成了一半,國慶之後,能有這麼充足的時間再來寫真的不容易了。

下篇更新介面卡模式

設計模式 10 狀態模式(事務的狀態)

要點 例項 將每個狀態的行為區域性化到它自己的類中 將容易產生問題的if語句刪除,以方便日後的維護。讓每乙個狀態 對修改關閉 讓糖果機 堆擴充套件開放 因為可以加入新的狀態類 建立乙個新的 基和類結構,這更能對映萬 能糖果公司的圖,而且更容易閱讀和理解 允許物件在內部狀態改變時改變它的行為,物件看起...

設計模式 狀態模式

狀態模式 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。狀態模式主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況,把狀態的判斷邏輯轉移到表示不同狀態的一些列類當中,可以把複雜的判斷邏輯簡化。當乙個物件的行為取決於它的狀態,並且它必須在執行時刻根據狀態改變它的行...

設計模式 狀態模式

1.概述 當乙個物件的內在狀態改變時允許改變其行為,這個物件看起來像是改變了其類。2.解決的問題 主要解決的是當控制乙個物件狀態轉換的條件表示式過於複雜時的情況。把狀態的判斷邏輯轉移到表示不同的一系列類當中,可以把複雜的邏輯判斷簡單化。3.模式中的角色 3.1 上下文環境 context 它定義了客...