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