策略模式

策略模式

參考博文

http://baijiahao.baidu.com/s?id=1601547440739500969&wfr=spider&for=pc


概念

其思想是針對一組算法,將每一種算法都封裝到具有共同接口的獨立的類中,從而使它們可以相互替換。策略模式的最大特點是使得算法可以在不影響客戶端的情況下發(fā)生變化,從而改變不同的功能。

特點

  1. 封裝變化的概念。
  2. 編程中使用接口,而不是使用的是具體的實現(xiàn)類(面向接口編程)。

比如說我們要實現(xiàn)對一個數(shù)組的元素排序,但是到底是要升序還是降序,這個完全由我們來去控制。我們可以把排序的方式全部封裝起來去實現(xiàn)同一個接口,傳給替我們執(zhí)行策略的類

代碼

現(xiàn)在有個場景:客戶下訂單,需要采用多種支付方式。(這里僅做簡單邏輯)

  • 頂層策略接口Payment

    package com.pmz.strategy;
    
    public interface Payment {
    
        void pay(int id,double account);
    
    }
    

    支付方式對外提供的統(tǒng)一接口

  • 支付寶支付AliPay實現(xiàn)頂層策略接口Payment

    package com.pmz.strategy;
    
    public class AliPay implements Payment {
        @Override
        public void pay(int id, double account) {
            System.out.println("id為"+id+"的用戶,使用支付寶支付了"+account+"元");
        }
    }
    

    具體的支付方式

  • 微信支付WeChatPay實現(xiàn)頂層策略接口Payment

    package com.pmz.strategy;
    
    public class WechatPay implements Payment {
    
        @Override
        public void pay(int id, double account) {
            System.out.println("id為"+id+"的用戶,使用微信支付了"+account+"元");
        }
    }
    

    具體的支付方式

  • 訂單類 Order

    package com.pmz.strategy;
    
    public class Order {
      //將支付方式的接口作為顯示引用
        private Payment payment;
      
        public Order(Payment payment){
            this.payment = payment;
        }
        //執(zhí)行策略
        public void confirmOrder(int id,double account){
            payment.pay(id,account);
        }
    }
    

    執(zhí)行策略

  • 測試類 PaymentStrategyTest

    package com.pmz.strategy;
    
    public class PaymentStrategyTest {
    
        public static void main(String[] args) {
            //給策略執(zhí)行類傳入相應的策略實現(xiàn)
            Order order = new Order(new WechatPay());
            //傳入?yún)?shù),執(zhí)行策略
            order.confirmOrder(1,100.86);
        }
    }
    
  • 輸出

    id為1的用戶,使用微信支付了100.86元
    

優(yōu)缺點

優(yōu)點:

  1. 策略模式符合開閉原則。

  2. 避免使用多重條件轉(zhuǎn)移語句,如 if...else...語句、switch 語句

  3. 使用策略模式可以提高算法的保密性和安全性。

缺點:

  1. 客戶端必須知道所有的策略,并且自行決定使用哪一個策略類。

  2. 代碼中會產(chǎn)生非常多策略類,增加維護難度。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 1、從項目"模擬鴨子游戲"實例講解策略模式:假如一個有個鴨子,他會叫、會飛、膚色表現(xiàn)不一樣,有不同顏色的鴨子,而且...
    朕要回幼兒園閱讀 799評論 0 0
  • 定義:策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使他們之間可以相互替換,策略模式讓算法獨立于使它的客...
    明朗__閱讀 323評論 0 0
  • 策略模式封裝了變化!??! 策略模式是一種定義一系列算法的方法,從概念上來看,所有這些算法完成相同的工作,只是實現(xiàn)不...
    JustCode閱讀 270評論 0 0
  • 引言:策略模式,顧名思義,就是:同一堆對象,不同的交流方式和語言內(nèi)容,達到不同的目的。比如:同一套零件,根據(jù)不同組...
    androidjp閱讀 711評論 0 2

友情鏈接更多精彩內(nèi)容