本篇內(nèi)容主要講解“怎么用狀態(tài)模式代替if-else”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用狀態(tài)模式代替if-else”吧!
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比惠山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式惠山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋惠山地區(qū)。費(fèi)用合理售后完善,十年實體公司更值得信賴。
狀態(tài)模式是行為型設(shè)計模式的一種。其設(shè)計理念是當(dāng)對象的內(nèi)部狀態(tài)發(fā)生改變時,隨之改變其行為。狀態(tài)和行為之間是一一對應(yīng)的。
該模式主要用于,對象的行為依賴于它的狀態(tài),并且其行為是隨著狀態(tài)的改變而切換時。
類圖講解
State:抽象狀態(tài)接口(也可以定義成抽象類),該接口封裝了所有狀態(tài)所對應(yīng)的行為。
ConcreteStateA/B:具體狀態(tài)類,該類實現(xiàn)了抽象狀態(tài)接口,會根據(jù)自身對應(yīng)的狀態(tài)來實現(xiàn)接口中定義的方法,還有另一個功能是指明如何過渡到下一個狀態(tài)。
Context:環(huán)境(上下文)角色,該類負(fù)責(zé)狀態(tài)的切換,還持有一個State實例,代表當(dāng)前環(huán)境所處狀態(tài)。
案例:通過狀態(tài)模式來實現(xiàn)自助售賣機(jī)的功能。
狀態(tài)接口
public interface State { // 挑選商品 void choose(); // 付款 boolean payment(); // 分發(fā)商品 void dispenseCommodity(); }
挑選商品狀態(tài)類
public class ChooseGoods implements State { VendingMachine machine; public ChooseGoods(VendingMachine machine) { this.machine = machine; } @Override public void choose() { if (machine.getCount() > 0) { System.out.println("商品挑選成功,請及時付款!"); machine.setState(machine.getPaymentState()); } else { System.out.println("很遺憾,商品售罄了!"); machine.setState(machine.getEmptyState()); } } @Override public boolean payment() { System.out.println("請先挑選商品!"); return false; } @Override public void dispenseCommodity() { System.out.println("請先挑選商品!"); } }
付款狀態(tài)類
public class PaymentState implements State { VendingMachine machine; public PaymentState(VendingMachine machine) { this.machine = machine; } @Override public void choose() { System.out.println("商品已選購?fù)瓿烧埼鹬貜?fù)挑選"); } @Override public boolean payment() { Random random = new Random(); int num = random.nextInt(10); if(num % 2 == 0){ System.out.println("付款成功!"); machine.setState(machine.getDispenseCommodityState()); return true; } System.out.println("付款失敗,請重新支付!"); return false; } @Override public void dispenseCommodity() { System.out.println("請先完成支付!"); } }
商品售罄狀態(tài)類
public class EmptyState implements State { VendingMachine machine; public EmptyState(VendingMachine machine) { this.machine = machine; } @Override public void choose() { System.out.println("對不起商品已售罄!"); } @Override public boolean payment() { System.out.println("對不起商品已售罄!"); return false; } @Override public void dispenseCommodity() { System.out.println("對不起商品已售罄!"); } }
分發(fā)商品狀態(tài)類
public class DispenseCommodityState implements State { VendingMachine machine; public DispenseCommodityState(VendingMachine machine) { this.machine = machine; } @Override public void choose() { System.out.println("請及時取走您的商品!"); } @Override public boolean payment() { System.out.println("請及時取走您的商品!"); return false; } @Override public void dispenseCommodity() { System.out.println("請及時取走您的商品!"); machine.setState(machine.getChooseGoods()); } }
自動售貨機(jī) => Context角色
public class VendingMachine { // 表示當(dāng)前狀態(tài) private State state = null; // 商品數(shù)量 private int count = 0; private State chooseGoods = new ChooseGoods(this); private State paymentState = new PaymentState(this); private State dispenseCommodityState = new DispenseCommodityState(this); private State emptyState = new EmptyState(this); public VendingMachine(int count) { this.count = count; this.state = this.getChooseGoods(); } // 購買商品 public void purchase() { // 挑選商品 state.choose(); // 支付成功 if (state.payment()) { // 分發(fā)商品 state.dispenseCommodity(); } } // 獲取商品后將商品減一 public int getCount() { return count--; } // get和set方法 ... }
客戶端測試類
public class Client { public static void main(String[] args) { VendingMachine machine = new VendingMachine(1); for (int i = 1; i < 4; i++) { System.out.println("第" + i + "次購買。"); machine.purchase(); } } }
執(zhí)行結(jié)果
1、狀態(tài)模式將每個狀態(tài)所對應(yīng)的行為封裝到一個類中,大大提高了代碼的可讀性。并且通過這樣的設(shè)計還可以消除多余的if-else語句,方便代碼的維護(hù)。
2、狀態(tài)模式符合“開閉原則”,容易增加和刪除狀態(tài)。
3、任何事情都有利弊,狀態(tài)模式也不例外。其最顯著的問題是,每個狀態(tài)都要對應(yīng)一個類,當(dāng)狀態(tài)過多時會產(chǎn)生大量的類,從而加大維護(hù)成本。
4、應(yīng)用場景:當(dāng)一個需求有很多狀態(tài),并且狀態(tài)之間會進(jìn)行轉(zhuǎn)換,不同狀態(tài)還對應(yīng)不同的行為時就可以考慮使用“狀態(tài)模式”
到此,相信大家對“怎么用狀態(tài)模式代替if-else”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享文章:怎么用狀態(tài)模式代替if-else
文章鏈接:http://bm7419.com/article44/pcehhe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、商城網(wǎng)站、做網(wǎng)站、網(wǎng)站排名、虛擬主機(jī)、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)