成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

點外賣,讓我想起了 策略模式

開發 前端
策略模式:英文為Strategy Pattern,是指定義了算法家族、分別封裝起來,讓他們之間可以相互替換,此設計模式讓算法的變化不會影響到使用算法的用戶。

[[402404]]

今天給大家分享的是策略模式,具體內容大綱如下:

生活案例

在這互聯網時代,尤其是在城市中,有一幫騎著電瓶車,穿梭在大街小巷中,這幫人就是外賣小哥。

[[402405]]

對于點外賣,我也點過不少。有一次,外賣下單的時候,我突然聯想到了一個設計模式---策略模式。

策略模式是個啥?

策略模式:英文為Strategy Pattern,是指定義了算法家族、分別封裝起來,讓他們之間可以相互替換,此設計模式讓算法的變化不會影響到使用算法的用戶。

英文

Define a family of algorithms,encapsulate each one,and make them interchangeable.

大致意思:定義一組算法,將每個算法都封裝起來,并且使它們之間可以互換。

在策略模式中,一個類的行為或其算法可以在運行時更改。這種類型的設計模式屬于行為型模式。

策略模式通用代碼

java代碼實現如下:

  1. class Client { 
  2.  
  3.     //抽象策略類 Strategy 
  4.     interface IStrategy { 
  5.         void algorithm(); 
  6.     } 
  7.  
  8.     //具體策略類 ConcreteStrategy 
  9.     static class ConcreteStrategyA implements IStrategy { 
  10.  
  11.         @Override 
  12.         public void algorithm() { 
  13.             System.out.println("Strategy A"); 
  14.         } 
  15.     } 
  16.  
  17.     //具體策略類 ConcreteStrategy 
  18.     static class ConcreteStrategyB implements IStrategy { 
  19.  
  20.         @Override 
  21.         public void algorithm() { 
  22.             System.out.println("Strategy B"); 
  23.         } 
  24.     } 
  25.  
  26.     //上下文環境 
  27.     static class Context { 
  28.         private IStrategy mStrategy; 
  29.  
  30.         public Context(IStrategy strategy) { 
  31.             this.mStrategy = strategy; 
  32.         } 
  33.  
  34.         public void algorithm() { 
  35.             this.mStrategy.algorithm(); 
  36.         } 
  37.     } 
  38.      
  39.    public static void main(String[] args) { 
  40.         //選擇一個具體策略 
  41.         IStrategy strategy = new ConcreteStrategyA(); 
  42.         //來一個上下文環境 
  43.         Context context = new Context(strategy); 
  44.         //客戶端直接讓上下文環境執行算法 
  45.         context.algorithm(); 
  46.     } 

從上面的通用代碼,我們可以得知其UML圖。

策略模式UML圖

策略模式中的角色

從 UML 類圖中,我們可以看到,策略模式主要包含三種角色:

  • 上下文角色(Context):用來操作策略的上下文環境,屏蔽高層模塊(客戶端)對策略,算法的直接訪問,封裝可能存在的變化;
  • 抽象策略角色(Strategy):規定策略或算法的行為;
  • 具體策略角色(ConcreteStrategy):具體的策略或算法實現;

策略模式優缺點

優點

  • 策略模式符合開閉原則
  • 避免使用多重轉換語句,比如:if...else、switch語句。
  • 使用策略模式可以提高算法的保密性和安全性

缺點

  • 客戶端必須知道所有策略,并且自行決定使用哪一種策略
  • 代碼中產生非常多的策略類,增加后期維護難度

策略模式使用場景

在日常開發中,策略模式適用于以下三種場景:

  • 針對同一類型問題,有多重處理方式,每一種都能獨立解決問題。
  • 算法需要自由切換的場景。
  • 需要屏蔽算法規則的場景

這個說起來,還是不太好理解。

下面,我們就來使用生活案例來實現,讓大家知道策略模式到底是怎么使用的。

支付案例代碼重構,三個版本

外面下單,選擇支付方式的時候,我覺這個功能,我們可以模仿著使用策略模式來實現一下。下面我們通過三個版本的迭代來實現,很有意思的。

第一版

先定義一個抽象類Pay:

  1. //定義抽象類,我們可以把一些共用功能放在抽象類里實現 
  2. //比如:可用余額和本次支付金額進行比較,統一返回“支付失敗” 
  3. public abstract class  Pay { 
  4.     abstract  void doPay(); 

下面模擬三種支付方式:

  1. public class AliPay extends Pay { 
  2.     @Override 
  3.     public void doPay() { 
  4.         System.out.println("使用支付寶支付"); 
  5.     } 
  6. public class UnionPay extends Pay { 
  7.     @Override 
  8.     public void doPay() { 
  9.         System.out.println("使用銀聯支付"); 
  10.     } 
  11. public class WechatPay extends Pay { 
  12.     @Override 
  13.     public void doPay() { 
  14.         System.out.println("使用微信支付"); 
  15.     } 

我們再來進行支付:

  1. public class PayTest { 
  2.     public static void main(String[] args) { 
  3.         //把選擇權交給了用戶 
  4.         Order order = new Order(new WechatPay()); 
  5.         order.pay();* 
  6.     } 

運行結果:

  1. 使用微信支付 

這樣我們就使用策略模式實現了簡單版本的支付,但是其中有個很不爽的地方,就是每次還得自己手工new一個支付方式的對象。鑒于此,我們對第一版進行重構。

第二版

前面的實現都不變,變化的是發起支付的時候,只要前端傳一個key過來就可以了,實現如下:

  1. public class PayTest { 
  2.     public static void main(String[] args) {  
  3.  
  4.         String payKey = "Wechat"
  5.         Order order = null
  6.         //通過判斷前端傳過來的key,判斷使用哪種支付方式 
  7.         if (payKey.equals("Ali")) { 
  8.             order = new Order(new AliPay()); 
  9.         } else if (payKey.equals("Wechat")) { 
  10.             order = new Order(new WechatPay()); 
  11.         } else if (payKey.equals("union")) { 
  12.             order = new Order(new UnionPay()); 
  13.         }else { 
  14.             //給出一個默認方式 
  15.             order = new Order(new WechatPay()); 
  16.         } 
  17.         order.pay(); 
  18.     } 

運行結果

  1. 使用微信支付 

這樣我們就實現了,通過前端傳過來的key,然后選出對應的支付方式。但是問題又來了,如果支付方式不斷增多,那這里的if...else豈不是會越來越多嗎?后續維護成本不是越來越大嗎?

于是,第三版就有了。

第三版

在第二版中,會出現大量的if...else,會給后續的代碼維護帶來不便,于是在這一版中,我們對其進行重構,引入了注冊式單例模式。

  1. import java.util.HashMap; 
  2. import java.util.Map; 
  3.  
  4. public enum PayStrategyEnum { 
  5.     ALI_PAY("Ali"), 
  6.     WECHAT_PAY("Wechat"), 
  7.     UNION_PAY("union"), 
  8.     //默認使用微信支付 
  9.     DEFAULT_PAY("Wechat"); 
  10.  
  11.     private String key
  12.  
  13.     PayStrategyEnum(String key) { 
  14.         this.key = key
  15.     } 
  16.  
  17.     private static final Map<String, Pay> payKeyMap = new HashMap(); 
  18.  
  19.     static { 
  20.         payKeyMap.put(ALI_PAY.key, new AliPay()); 
  21.         payKeyMap.put(WECHAT_PAY.key, new WechatPay()); 
  22.         payKeyMap.put(UNION_PAY.key, new UnionPay()); 
  23.         payKeyMap.put(DEFAULT_PAY.key, new WechatPay()); 
  24.     } 
  25.  
  26.     public static Pay getPay(String payKey) { 
  27.         if (!payKeyMap.containsKey(payKey)) { 
  28.             return payKeyMap.get(DEFAULT_PAY.key); 
  29.         } 
  30.         return payKeyMap.get(payKey); 
  31.     } 

然后,在訂單支付的時候就變成了這樣了:

  1. public class PayTest { 
  2.     public static void main(String[] args) {  
  3.         String payKey = "Wechat";  
  4.         Order order = new Order(PayStrategyEnum.getPay(payKey)); 
  5.         order.pay(); 
  6.     } 

運行結果

  1. 使用微信支付 

這樣,我們就成功的規避了大量的if...else了,爽歪歪!

其實,上面三個版本的代碼,是不是覺得很爽,這就是設計模式的強大之處。

PS:關于上面的三個版本,其實我們還可以繼續完善,繼續重構,感興趣的你可以去試試如何繼續重構。

總結

好了,今天的策略模式就到這里。其實,設計模式在大多數情況下,是不會單獨存在的,都是使用多種設計模式混合起來使用的。

策略模式使用的就是面向對象的繼承和多態機制,從而實現同一行為在不同場景下不同實現。

最好記的案例:

我們可以使用不同的交通工具去北京玩

坐飛機、坐高鐵、坐汽車、開車、騎車。方式很多,你想選哪一條就選那一條。

最后用一句話來總結策略模式:

條條大路通羅馬

本文轉載自微信公眾號「Java后端技術全?!?,可以通過以下二維碼關注。轉載本文請聯系Java后端技術全棧公眾號。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2022-04-29 21:37:34

漏洞網絡安全網絡攻擊

2025-05-19 08:24:29

圖片加載開發

2020-07-20 07:48:53

單例模式

2013-11-26 16:09:34

Android設計模式

2024-12-09 09:40:00

策略模式Java

2021-03-08 10:27:42

CIO銷售策略IBM

2021-04-26 06:03:07

Reacterror前端

2021-06-09 08:53:34

設計模式策略模式工廠模式

2015-09-08 13:39:10

JavaScript設計模式

2011-07-20 14:04:42

.NET策略模式

2012-08-30 09:07:33

設計模式

2021-06-17 06:19:20

存儲SQL數據庫

2024-10-06 12:56:36

Golang策略設計模式

2017-07-07 10:55:14

數據庫MongoDB設計模式

2012-12-19 14:58:28

2023-06-26 07:10:51

2014-12-29 10:39:16

JS

2024-01-29 12:22:07

設計模式策略模式

2024-01-22 11:48:20

策略模式開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一级黄色毛片子 | 国产精品中文 | 欧美日本在线观看 | 国产成人精品免费视频大全最热 | 国产精品日韩一区二区 | av片在线免费看 | 欧美成人第一页 | 狠狠影院 | 成人不卡 | 夜夜久久 | 欧美黄色一区 | 欧美综合精品 | av免费网址 | 国产欧美精品区一区二区三区 | 国产乱码精品一区二区三区中文 | 亚洲日韩中文字幕一区 | h视频在线免费观看 | 黄色永久免费 | 久久久免费| 国产片网站 | 亚洲一区二区三区四区五区中文 | www.99热| 亚洲精品在线免费 | 黄色av观看 | 日韩一区精品 | 美女久久 | 国产成人免费视频网站视频社区 | 成年人精品视频在线观看 | a国产一区二区免费入口 | 欧美群妇大交群中文字幕 | 久久国产综合 | 日韩第一区 | 国产日韩视频 | 中文字幕在线观看视频网站 | 国产一区二区高清在线 | 在线观看国产 | 国产一级片 | 免费一区二区三区 | 亚洲视频一区二区三区 | 日韩在线观看中文字幕 | 99精品免费视频 |