狀態模式

第1、狀態模式定義

狀態模式容許一個對象在其內部狀態改變的時候改變其行爲。這個對象看上去就像是改變了它的類同樣。算法

第2、狀態模式應用場景

  1.一個對象的行爲取決於它的狀態,而且它必須在運行時刻根據狀態改變它的行爲。微信

2.操做中含有龐大的多分支的條件語句,且這些分支依賴於該對象的狀態。這個狀態一般用一個或多個枚舉常量表示。 一般,有多個操做包含這一相同的條件結構。State模式將每個條件分支放入一個獨立的類中。這使得你能夠根據對象自身的狀況將對象的狀態做爲一個對象,這一對象能夠不依賴於其餘對象而獨立變化。ide

第3、狀態模式實現代碼

3.1須要重構代碼

  public String orderState(String state) { if (state.equals("0")) { return "已經發貨"; } if (state.equals("1")) { return "正在運送中...調用第三方快遞接口 展現 運送信息"; } if (state.equals("2")) { return "正在派送中... 返回派送人員信息"; } if (state.equals("3")) { return "已經簽收,提示給用戶快遞員評價"; } if (state.equals("4")) { return "拒絕簽收, 從新開始申請退單"; } if (state.equals("5")) { return "訂單交易失敗,調用短信接口提示 "; } return "未找到對應的狀態"; } }

 

3.2狀態模式和策略模式的區別

一、狀態模式重點在各狀態之間的切換從而作不一樣的事情,而策略模式更側重於根據具體狀況選擇策略,並不涉及切換。測試

二、狀態模式不一樣狀態下作的事情不一樣,而策略模式作的都是同一件事,例如聚合支付平臺,有支付寶、微信支付、銀聯支付,雖然策略不一樣,但最終作的事情都是支付,微信支付

也就是說他們之間是可替換的。反觀狀態模式,各個狀態的同一方法作的是不一樣的事,不能互相替換。this

狀態模式封裝了對象的狀態,而策略模式封裝算法或策略。由於狀態是跟對象密切相關的,它不能被重用;而經過從Context中分離出策略或算法,咱們能夠重用它們。spa

在狀態模式中,每一個狀態經過持有Context的引用,來實現狀態轉移;可是每一個策略都不持有Context的引用,它們只是被Context使用。code

排序算法 快速排序 選擇排序 冒泡排序 策略對象

只要是和狀態相關 訂單、交易、支付狀態。blog

3.3代碼實現

/** *統一接口 */
public interface OrderState { public void orderService(); } @Service public class AlreadySignedOrderState implements OrderState { @Override public void orderService() { System.out.println(">>>切換爲已經簽收狀態.."); } } @Service public class InTransitOrderState implements OrderState { @Override public void orderService() { System.out.println(">>>切換爲正在運送狀態..."); } } @Service public class ShippedAlreadyOrderState implements OrderState { @Override public void orderService() { System.out.println(">>>切換爲已經發貨狀態.."); } } /** * 上下文 */ @Service public class ContextState { private OrderState orderState; public ContextState(OrderState orderState){ this.orderState = orderState; } public void switchOrder(){ this.orderState.orderService(); } } /** * 測試類 */
public class Test001 { public static void main(String[] args) { ContextState contextState = new ContextState(new AlreadySignedOrderState()); contextState.switchOrder(); } }
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息