摘要:狀態(tài)模式對于對象內(nèi)部的狀態(tài),允許其在不同的狀態(tài)下,擁有不同的行為,對狀態(tài)多帶帶封裝成類。通過什么來舉例子呢設(shè)計(jì)到多狀態(tài),不同狀態(tài)下各自具有不同行為的東西,而且理解起來相對容易的。下篇更新適配器模式
目錄
狀態(tài)模式
為什么使用狀態(tài)模式?
應(yīng)用實(shí)例
狀態(tài)模式狀態(tài)模式,顧名思義,肯定是和狀態(tài)有關(guān),進(jìn)一步思考,我們在討論的是設(shè)計(jì)模式,設(shè)計(jì)模式中的重要原則對變化的進(jìn)行封裝,順著這個(gè)思路去想,那么是有很多的變化的狀態(tài),然后通過狀態(tài)設(shè)計(jì)模式,來對這些變化的狀態(tài)進(jìn)行封裝,故狀態(tài)設(shè)計(jì)模式。
狀態(tài)模式:對于對象內(nèi)部的狀態(tài),允許其在不同的狀態(tài)下,擁有不同的行為,對狀態(tài)多帶帶封裝成類。
和策略模式類似,這里是將每一個(gè)狀態(tài)多帶帶封裝成類,每個(gè)狀態(tài)下?lián)碛胁煌袨椤?/p> 為什么使用狀態(tài)模式?
為什么要使用狀態(tài)模式?通過一個(gè)例子來看,對于一些問題,當(dāng)我們通過一個(gè)例子將其具體化之后,我們會(huì)發(fā)現(xiàn)問題處理起來變得簡單,同時(shí)理解起來也不會(huì)和之前那樣晦澀難懂。通過什么來舉例子呢?設(shè)計(jì)到多狀態(tài),不同狀態(tài)下各自具有不同行為的東西,而且理解起來相對容易的。最近在地鐵站發(fā)現(xiàn)了有個(gè)叫5個(gè)橙子的投幣榨汁機(jī),我們投幣10元前,我們就可以獲得一杯用5個(gè)橙子榨出來的橙汁一杯,如果讓我們設(shè)計(jì)這套系統(tǒng),要怎么設(shè)計(jì)呢?首先要有的feature,投幣,退幣,出橙子,然后其要有的state有沒有錢幣,10元錢幣,大于10元的錢幣,小于10元的錢幣,橙子售空,還有橙子。動(dòng)手來寫。
//榨汁機(jī) public class MillMachine{ //各種狀態(tài) 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(); } } //產(chǎn)生果汁 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"); } } }
根據(jù)代碼,我們可以看出,我們一共擁有四種狀態(tài),分別為有錢,沒錢,售空,未售空。操作有按下榨汁按鈕,插入錢幣,取出錢幣,榨汁,當(dāng)然榨汁操作并不是我們手動(dòng)可以觸發(fā)的。對于其中相應(yīng)的方法寫的也比較詳細(xì),各個(gè)操作下狀態(tài)的轉(zhuǎn)換,根據(jù)上面的代碼,我們可以看出是很繁瑣的,而且一旦增加狀態(tài),或者是操作,需要我們修改很多的代碼,靈活性和可擴(kuò)展性很差,現(xiàn)在就到了我們的狀態(tài)設(shè)計(jì)模式大顯身手的時(shí)候了。既然是有很多的狀態(tài),不同狀態(tài)下相同的操作行為不同,那么我們就將每一種狀態(tài)多帶帶封裝成類,然后這些狀態(tài)分別實(shí)現(xiàn)各自不同操作下的行為,這樣我們的榨汁機(jī)只需要對幾個(gè)狀態(tài)對象進(jìn)行操作就可以了,使得代碼變得簡潔也方便以后的修改.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(){ //...... } }
通過這種方式來寫,讓我們的榨汁機(jī)類內(nèi)部的代碼量變得更加簡潔,針對接口進(jìn)行編程,同時(shí)帶來一個(gè)弊端就是使得我們的額外的增加了許多的狀態(tài)類,使得我們的代碼量增加了很多。
應(yīng)用實(shí)例Android中的一個(gè)應(yīng)用實(shí)例即使context和state之間,有興趣的可以針對源碼仔細(xì)了解,這里先貼出來。
用番茄鐘計(jì)時(shí)來寫這篇博客,用掉4個(gè)番茄。第五個(gè)也已經(jīng)完成了一半,國慶之后,能有這么充足的時(shí)間再來寫真的不容易了。
下篇更新適配器模式
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64645.html
摘要:裝飾器模式在不必改變原類文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對象的功能。通過使用裝飾器模式,我們可以實(shí)現(xiàn)關(guān)閉原有代碼,開放現(xiàn)有代碼的方式來實(shí)現(xiàn)更多的功能。 目錄 裝飾器模式 為什么使用裝飾器模式 應(yīng)用實(shí)例 裝飾器模式 看到裝飾器是在看《Thinking in Java》一書的時(shí)候,看到文件讀寫那邊的時(shí)候,有提到裝飾器模式,同時(shí)在文件讀寫的那一部分,對于各種讀入,寫出的方式,代碼組...
摘要:深入之繼承的多種方式和優(yōu)缺點(diǎn)深入系列第十五篇,講解各種繼承方式和優(yōu)缺點(diǎn)。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點(diǎn) JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點(diǎn)。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:安裝過后到命令行執(zhí)行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進(jìn)行下面的步驟了。全局安裝的包名稱由改成了。如果你已經(jīng)全局安裝了舊版本的或,你需要先通過卸載它。中的非常類似于事件每個(gè)都有一個(gè)字符串的事件類型和一個(gè)回調(diào)函數(shù)。 視頻教程 由于思否不支持視頻外鏈,視頻請移步http://www.henrongyi.top 你能學(xué)到什么 在這一期的學(xué)習(xí)進(jìn)度中,我們會(huì)開始學(xué)習(xí)在我們工作開...
摘要:安裝過后到命令行執(zhí)行檢查版本,如果彈出版本的話恭喜你安裝成功,我們開始進(jìn)行下面的步驟了。全局安裝的包名稱由改成了。如果你已經(jīng)全局安裝了舊版本的或,你需要先通過卸載它。中的非常類似于事件每個(gè)都有一個(gè)字符串的事件類型和一個(gè)回調(diào)函數(shù)。 視頻教程 由于思否不支持視頻外鏈,視頻請移步http://www.henrongyi.top 你能學(xué)到什么 在這一期的學(xué)習(xí)進(jìn)度中,我們會(huì)開始學(xué)習(xí)在我們工作開...
閱讀 3016·2021-10-12 10:17
閱讀 1619·2021-09-01 11:38
閱讀 1141·2019-08-30 15:44
閱讀 3511·2019-08-26 18:36
閱讀 544·2019-08-26 13:25
閱讀 1918·2019-08-26 10:29
閱讀 2872·2019-08-23 15:58
閱讀 788·2019-08-23 12:59