摘要:狀態模式對于對象內部的狀態,允許其在不同的狀態下,擁有不同的行為,對狀態多帶帶封裝成類。通過什么來舉例子呢設計到多狀態,不同狀態下各自具有不同行為的東西,而且理解起來相對容易的。下篇更新適配器模式
目錄
狀態模式
為什么使用狀態模式?
應用實例
狀態模式狀態模式,顧名思義,肯定是和狀態有關,進一步思考,我們在討論的是設計模式,設計模式中的重要原則對變化的進行封裝,順著這個思路去想,那么是有很多的變化的狀態,然后通過狀態設計模式,來對這些變化的狀態進行封裝,故狀態設計模式。
狀態模式:對于對象內部的狀態,允許其在不同的狀態下,擁有不同的行為,對狀態多帶帶封裝成類。
和策略模式類似,這里是將每一個狀態多帶帶封裝成類,每個狀態下擁有不同行為。
為什么使用狀態模式?為什么要使用狀態模式?通過一個例子來看,對于一些問題,當我們通過一個例子將其具體化之后,我們會發現問題處理起來變得簡單,同時理解起來也不會和之前那樣晦澀難懂。通過什么來舉例子呢?設計到多狀態,不同狀態下各自具有不同行為的東西,而且理解起來相對容易的。最近在地鐵站發現了有個叫5個橙子的投幣榨汁機,我們投幣10元前,我們就可以獲得一杯用5個橙子榨出來的橙汁一杯,如果讓我們設計這套系統,要怎么設計呢?首先要有的feature,投幣,退幣,出橙子,然后其要有的state有沒有錢幣,10元錢幣,大于10元的錢幣,小于10元的錢幣,橙子售空,還有橙子。動手來寫。
//榨汁機 public class MillMachine{ //各種狀態 final static int SOLD_OUT = 0; final static int SOLD = 1; final static int NO_MONEY = 3; final static int HAS_MONEY = 4; int state; int count; public MillMachine(int count){ this.count = count; if(count>0) state = NO_MONEY; } //插入錢幣 public void insertMoney(){ if(state == HAS_MONEY) System.out.println("You can"t insert Money"); else if(state == NO_MONEY){ System.out.println("You insert 10"); state = HAS_MONEY; } 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(){ if(state == HAS_MONEY){ System.out.println("You will get Money"); state = NO_MONEY; }else if(state == NO_MONEY){ System.out.println("You haven"t insert money"); }else if(state == SOLD){ System.out.println("You can"t get back the money"); }else if(state == SOLD_OUT){ System.out.println("You haven"t insert money"); } } //按下榨汁按鈕 public void pressKnob(){ if(state == SOLD){ System.out.println("Please wait a minute,you will get a cup of juice"); }else if(state == SOLD_OUT){ System.out.prinltn("Sorry,three are"t juice for you"); }else if(state == NO_MONEY){ System.out.println("Please insert Money"); }else if(state == HAS_MONEY){ System.out.pritln("You will get a cup of juice") state = SOLD; produce(); } } //產生果汁 public void produce(){ if(state == SOLD){ System.out.println("You get a cup of juice"); count--; if(count<0) state=SOLD_OUT; else state=NO_MONEY; }else if(state==SOLD_OUT){ System.out.println("Nothing"); }else if(state==NO_MONEY){ System.out.println("Nothing"); } else if(state==HAS_MONEY){ System.out.println("Nothing"); } } }
根據代碼,我們可以看出,我們一共擁有四種狀態,分別為有錢,沒錢,售空,未售空。操作有按下榨汁按鈕,插入錢幣,取出錢幣,榨汁,當然榨汁操作并不是我們手動可以觸發的。對于其中相應的方法寫的也比較詳細,各個操作下狀態的轉換,根據上面的代碼,我們可以看出是很繁瑣的,而且一旦增加狀態,或者是操作,需要我們修改很多的代碼,靈活性和可擴展性很差,現在就到了我們的狀態設計模式大顯身手的時候了。既然是有很多的狀態,不同狀態下相同的操作行為不同,那么我們就將每一種狀態多帶帶封裝成類,然后這些狀態分別實現各自不同操作下的行為,這樣我們的榨汁機只需要對幾個狀態對象進行操作就可以了,使得代碼變得簡潔也方便以后的修改.Show the code
public class MillMachine{ State noMoneyState; State hasMoneyState; State soldState; State soldOutState; State state; int count; public MillMachine(int count){ noMoneyState = new NoMoneyState(this); //..... this.count = count; if(count>0) state = NoMoneyState; } public void insertMoney(){ state.insertMoney(); } public void withdrawMoney(){ state.withdrawMoney(); } public void pressKnob(){ state.pressKnob(); } public void produce(){ state.produce(); } public State getNoMoneyState(){ return this.NoMoneyState; } public void setState(State state){ this.state = state; } } public interface State{ public void insertMoney(); public void withdrawMoney(); public void pressKnob(); public void produce(); } public class HasMoneyState implements State{ MillMachine machine; public HasMoneyState(MillMachine machine){ this.machine = machine; } public void insertMoney(){ //....... } public void withdrawMoney(){ System.out.pritln("you will get your money"); machine.setState(machine.getNoMoney()); } public void pressKnob(){ //...... } public void produce(){ //...... } }
通過這種方式來寫,讓我們的榨汁機類內部的代碼量變得更加簡潔,針對接口進行編程,同時帶來一個弊端就是使得我們的額外的增加了許多的狀態類,使得我們的代碼量增加了很多。
應用實例Android中的一個應用實例即使context和state之間,有興趣的可以針對源碼仔細了解,這里先貼出來。
用番茄鐘計時來寫這篇博客,用掉4個番茄。第五個也已經完成了一半,國慶之后,能有這么充足的時間再來寫真的不容易了。
下篇更新適配器模式
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64645.html
摘要:裝飾器模式在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。通過使用裝飾器模式,我們可以實現關閉原有代碼,開放現有代碼的方式來實現更多的功能。 目錄 裝飾器模式 為什么使用裝飾器模式 應用實例 裝飾器模式 看到裝飾器是在看《Thinking in Java》一書的時候,看到文件讀寫那邊的時候,有提到裝飾器模式,同時在文件讀寫的那一部分,對于各種讀入,寫出的方式,代碼組...
摘要:深入之繼承的多種方式和優缺點深入系列第十五篇,講解各種繼承方式和優缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執行了。 JavaScript深入之繼承的多種方式和優缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優缺點。 寫在前面 本文講解JavaScript各種繼承方式和優缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:安裝過后到命令行執行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進行下面的步驟了。全局安裝的包名稱由改成了。如果你已經全局安裝了舊版本的或,你需要先通過卸載它。中的非常類似于事件每個都有一個字符串的事件類型和一個回調函數。 視頻教程 由于思否不支持視頻外鏈,視頻請移步http://www.henrongyi.top 你能學到什么 在這一期的學習進度中,我們會開始學習在我們工作開...
摘要:安裝過后到命令行執行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進行下面的步驟了。全局安裝的包名稱由改成了。如果你已經全局安裝了舊版本的或,你需要先通過卸載它。中的非常類似于事件每個都有一個字符串的事件類型和一個回調函數。 視頻教程 由于思否不支持視頻外鏈,視頻請移步http://www.henrongyi.top 你能學到什么 在這一期的學習進度中,我們會開始學習在我們工作開...
閱讀 2985·2021-10-12 10:17
閱讀 1589·2021-09-01 11:38
閱讀 1081·2019-08-30 15:44
閱讀 3479·2019-08-26 18:36
閱讀 507·2019-08-26 13:25
閱讀 1884·2019-08-26 10:29
閱讀 2835·2019-08-23 15:58
閱讀 759·2019-08-23 12:59