溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用狀態(tài)模式代替if-else

發(fā)布時(shí)間:2021-10-21 09:39:40 來源:億速云 閱讀:198 作者:iii 欄目:web開發(fā)

本篇內(nèi)容主要講解“怎么用狀態(tài)模式代替if-else”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用狀態(tài)模式代替if-else”吧!

簡(jiǎn)介

狀態(tài)模式是行為型設(shè)計(jì)模式的一種。其設(shè)計(jì)理念是當(dāng)對(duì)象的內(nèi)部狀態(tài)發(fā)生改變時(shí),隨之改變其行為。狀態(tài)和行為之間是一一對(duì)應(yīng)的。

該模式主要用于,對(duì)象的行為依賴于它的狀態(tài),并且其行為是隨著狀態(tài)的改變而切換時(shí)。

狀態(tài)模式UML類圖

怎么用狀態(tài)模式代替if-else

類圖講解

State:抽象狀態(tài)接口(也可以定義成抽象類),該接口封裝了所有狀態(tài)所對(duì)應(yīng)的行為。

ConcreteStateA/B:具體狀態(tài)類,該類實(shí)現(xiàn)了抽象狀態(tài)接口,會(huì)根據(jù)自身對(duì)應(yīng)的狀態(tài)來實(shí)現(xiàn)接口中定義的方法,還有另一個(gè)功能是指明如何過渡到下一個(gè)狀態(tài)。

Context:環(huán)境(上下文)角色,該類負(fù)責(zé)狀態(tài)的切換,還持有一個(gè)State實(shí)例,代表當(dāng)前環(huán)境所處狀態(tài)。

案例講解

案例:通過狀態(tài)模式來實(shí)現(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("商品挑選成功,請(qǐng)及時(shí)付款!");       machine.setState(machine.getPaymentState());     } else {       System.out.println("很遺憾,商品售罄了!");       machine.setState(machine.getEmptyState());     }   }    @Override   public boolean payment() {     System.out.println("請(qǐng)先挑選商品!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("請(qǐng)先挑選商品!");   } }

付款狀態(tài)類

public class PaymentState implements State {    VendingMachine machine;    public PaymentState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("商品已選購(gòu)?fù)瓿烧?qǐng)勿重復(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("付款失敗,請(qǐng)重新支付!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("請(qǐng)先完成支付!");   } }

商品售罄狀態(tài)類

public class EmptyState implements State {    VendingMachine machine;    public EmptyState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("對(duì)不起商品已售罄!");   }    @Override   public boolean payment() {     System.out.println("對(duì)不起商品已售罄!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("對(duì)不起商品已售罄!");   } }

分發(fā)商品狀態(tài)類

public class DispenseCommodityState implements State {    VendingMachine machine;    public DispenseCommodityState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("請(qǐng)及時(shí)取走您的商品!");   }    @Override   public boolean payment() {     System.out.println("請(qǐng)及時(shí)取走您的商品!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("請(qǐng)及時(shí)取走您的商品!");     machine.setState(machine.getChooseGoods());   } }

自動(dòng)售貨機(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();   }    // 購(gòu)買商品   public void purchase() {     // 挑選商品     state.choose();     // 支付成功     if (state.payment()) {       // 分發(fā)商品       state.dispenseCommodity();     }   }      // 獲取商品后將商品減一   public int getCount() {     return count--;   }      // get和set方法 ...  }

客戶端測(cè)試類

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 + "次購(gòu)買。");       machine.purchase();     }   } }

執(zhí)行結(jié)果

怎么用狀態(tài)模式代替if-else

總結(jié)

1、狀態(tài)模式將每個(gè)狀態(tài)所對(duì)應(yīng)的行為封裝到一個(gè)類中,大大提高了代碼的可讀性。并且通過這樣的設(shè)計(jì)還可以消除多余的if-else語(yǔ)句,方便代碼的維護(hù)。

2、狀態(tài)模式符合“開閉原則”,容易增加和刪除狀態(tài)。

3、任何事情都有利弊,狀態(tài)模式也不例外。其最顯著的問題是,每個(gè)狀態(tài)都要對(duì)應(yīng)一個(gè)類,當(dāng)狀態(tài)過多時(shí)會(huì)產(chǎn)生大量的類,從而加大維護(hù)成本。

4、應(yīng)用場(chǎng)景:當(dāng)一個(gè)需求有很多狀態(tài),并且狀態(tài)之間會(huì)進(jìn)行轉(zhuǎn)換,不同狀態(tài)還對(duì)應(yīng)不同的行為時(shí)就可以考慮使用“狀態(tài)模式”

到此,相信大家對(duì)“怎么用狀態(tài)模式代替if-else”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI