中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用狀態模式代替if-else

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

本篇內容主要講解“怎么用狀態模式代替if-else”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用狀態模式代替if-else”吧!

簡介

狀態模式是行為型設計模式的一種。其設計理念是當對象的內部狀態發生改變時,隨之改變其行為。狀態和行為之間是一一對應的。

該模式主要用于,對象的行為依賴于它的狀態,并且其行為是隨著狀態的改變而切換時。

狀態模式UML類圖

怎么用狀態模式代替if-else

類圖講解

State:抽象狀態接口(也可以定義成抽象類),該接口封裝了所有狀態所對應的行為。

ConcreteStateA/B:具體狀態類,該類實現了抽象狀態接口,會根據自身對應的狀態來實現接口中定義的方法,還有另一個功能是指明如何過渡到下一個狀態。

Context:環境(上下文)角色,該類負責狀態的切換,還持有一個State實例,代表當前環境所處狀態。

案例講解

案例:通過狀態模式來實現自助售賣機的功能。

狀態接口

public interface State {   // 挑選商品   void choose();   // 付款   boolean payment();   // 分發商品   void dispenseCommodity(); }

挑選商品狀態類

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("請先挑選商品!");   } }

付款狀態類

public class PaymentState implements State {    VendingMachine machine;    public PaymentState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("商品已選購完成請勿重復挑選");   }    @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("請先完成支付!");   } }

商品售罄狀態類

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("對不起商品已售罄!");   } }

分發商品狀態類

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());   } }

自動售貨機 => Context角色

public class VendingMachine {   // 表示當前狀態   private State state = null;   // 商品數量   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()) {       // 分發商品       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();     }   } }

執行結果

怎么用狀態模式代替if-else

總結

1、狀態模式將每個狀態所對應的行為封裝到一個類中,大大提高了代碼的可讀性。并且通過這樣的設計還可以消除多余的if-else語句,方便代碼的維護。

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

3、任何事情都有利弊,狀態模式也不例外。其最顯著的問題是,每個狀態都要對應一個類,當狀態過多時會產生大量的類,從而加大維護成本。

4、應用場景:當一個需求有很多狀態,并且狀態之間會進行轉換,不同狀態還對應不同的行為時就可以考慮使用“狀態模式”

到此,相信大家對“怎么用狀態模式代替if-else”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

青州市| 苍山县| 洱源县| 永康市| 康马县| 永修县| 灵台县| 项城市| 林口县| 伊宁县| 新建县| 正安县| 板桥市| 茶陵县| 米脂县| 襄垣县| 汝南县| 巨野县| 襄城县| 偃师市| 淮阳县| 萝北县| 兰西县| 沽源县| 玉门市| 北碚区| 金湖县| 北京市| 息烽县| 井冈山市| 高淳县| 柯坪县| 广南县| 安吉县| 黄龙县| 南靖县| 察雅县| 成武县| 电白县| 周至县| 隆子县|