欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計模式之策略模式案例詳解

 更新時間:2022年07月26日 16:01:03   作者:kaico2018  
策略模式(Strategy?Pattern)定義了一組同類型的算法,在不同的類中封裝起來,每種算法可以根據(jù)當(dāng)前場景相互替換,從而使算法的變化獨立于使用它們的客戶端即算法的調(diào)用者

為什么使用策略模式?

答:策略模式是解決過多if-else (或者switch-case)代碼塊的方法之一,提高代碼的可維護性、可擴展性和可讀性。

優(yōu)缺點

優(yōu)點

  • 算法可以自由切換(高層屏蔽算法,角色自由切換)。
  • 避免使用多重條件判斷(如果算法過多就會出現(xiàn)很多種相同的判斷,很難維護)
  • 擴展性好(可自由添加取消算法而不影響整個功能)。

缺點

策略類數(shù)量增多(每一個策略類復(fù)用性很小,如果需要增加算法,就只能新增類)。所有的策略類都需要對外暴露(使用的人必須了解使用策略,這個就需要其它模式來補充,比如工廠模式、代理模式)。

Spring中哪里使用策略模式

ClassPathXmlApplicationContext Spring 底層Resource接口采用策略模式

Spring 為Resource 接口提供了如下實現(xiàn)類:

  • UrlResource:訪問網(wǎng)絡(luò)資源的實現(xiàn)類。
  • ClassPathResource:訪問類加載路徑里資源的實現(xiàn)類。
  • FileSystemResource:訪問文件系統(tǒng)里資源的實現(xiàn)類。
  • ServletContextResource:訪問相對于ServletContext 路徑里的資源的實現(xiàn)類
  • InputStreamResource:訪問輸入流資源的實現(xiàn)類。
  • ByteArrayResource:訪問字節(jié)數(shù)組資源的實現(xiàn)類。

策略模式設(shè)計圖

  • Strategy::策略接口或者策略抽象類,并且策略執(zhí)行的接口
  • ConcreateStrategyA、 B、C等:實現(xiàn)策略接口的具體策略類
  • Context::上下文類,持有具體策略類的實例,并負責(zé)調(diào)用相關(guān)的算法

代碼案例

統(tǒng)一支付接口

public interface Payment {
    /**
     * 獲取支付方式
     *
     * @return 響應(yīng),支付方式
     */
    String getPayType();
    /**
     * 支付調(diào)用
     *
     * @param order 訂單信息
     * @return 響應(yīng),支付結(jié)果
     */
    String pay(String order);
}

各種支付方式(策略)

@Component
public class AlipayPayment implements Payment {
    @Override
    public String getPayType() {
        return "alipay";
    }
    @Override
    public String pay(String order) {
        //調(diào)用阿里支付
        System.out.println("調(diào)用阿里支付");
        return "success";
    }
}
@Component
public class BankCardPayment implements Payment {
    @Override
    public String getPayType() {
        return "bankCard";
    }
    @Override
    public String pay(String order) {
        //調(diào)用微信支付
        System.out.println("調(diào)用銀行卡支付");
        return "success";
    }
}
@Component
public class WxPayment implements Payment {
    @Override
    public String getPayType() {
        return "weixin";
    }
    @Override
    public String pay(String order) {
        //調(diào)用微信支付
        System.out.println("調(diào)用微信支付");
        return "success";
    }
}

使用工廠模式來創(chuàng)建策略

public class PaymentFactory {
    private static final Map<String, Payment> payStrategies = new HashMap<>();
    static {
        payStrategies.put("weixin", new WxPayment());
        payStrategies.put("alipay", new AlipayPayment());
        payStrategies.put("bankCard", new BankCardPayment());
    }
    public static Payment getPayment(String payType) {
        if (payType == null) {
            throw new IllegalArgumentException("pay type is empty.");
        }
        if (!payStrategies.containsKey(payType)) {
            throw new IllegalArgumentException("pay type not supported.");
        }
        return payStrategies.get(payType);
    }
}

測試類

public class Test {
    public static void main(String[] args) {
        String payType = "weixin";
        Payment payment = PaymentFactory.getPayment(payType);
        String pay = payment.pay("");
        System.out.println(pay);
    }
}

到此這篇關(guān)于Java設(shè)計模式之策略模式詳解的文章就介紹到這了,更多相關(guān)Java策略模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 簡述Java編程之關(guān)系操作符

    簡述Java編程之關(guān)系操作符

    這篇文章主要介紹了簡述Java編程中的關(guān)系操作符,同時對比較類作了簡單介紹,需要的朋友可以參考下
    2017-09-09
  • 不同方式遍歷Map集合(全)

    不同方式遍歷Map集合(全)

    大家都知道Map是一種以鍵值對的形式存在的集合,其中每個鍵映射到一個值,下面把Map遍歷集合總結(jié)了一下給大家分享下,需要的朋友可以參考下
    2015-07-07
  • String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式

    String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式

    這篇文章主要介紹了String與Blob互轉(zhuǎn)和file文件與Blob互轉(zhuǎn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java?Handler同步屏障淺析講解

    Java?Handler同步屏障淺析講解

    同步屏障機制是什么?Handler發(fā)送的消息分為普通消息、屏障消息、異步消息,一旦Looper在處理消息時遇到屏障消息,那么就不再處理普通的消息,而僅僅處理異步的消息。不再使用屏障后,需要撤銷屏障,不然就再也執(zhí)行不到普通消息了
    2022-08-08
  • intellij idea tomcat熱部署配置教程

    intellij idea tomcat熱部署配置教程

    這篇文章主要介紹了intellij idea tomcat熱部署配置教程圖解,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-07-07
  • spring中的事務(wù)執(zhí)行流程圖解

    spring中的事務(wù)執(zhí)行流程圖解

    這篇文章主要介紹了spring中的事務(wù)執(zhí)行流程圖解,Spring事務(wù)是Spring框架提供的一種管理數(shù)據(jù)庫事務(wù)的機制,它通過將一系列數(shù)據(jù)庫操作封裝在一個事務(wù)中,保證這些操作要么全部成功執(zhí)行,要么全部回滾,從而確保數(shù)據(jù)的一致性和完整性,需要的朋友可以參考下
    2023-10-10
  • 為什么程序中突然多了 200 個 Dubbo-thread 線程的說明

    為什么程序中突然多了 200 個 Dubbo-thread 線程的說明

    這篇文章主要介紹了為什么程序中突然多了 200 個 Dubbo-thread 線程的說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Quartz作業(yè)調(diào)度基本使用詳解

    Quartz作業(yè)調(diào)度基本使用詳解

    這篇文章主要為大家介紹了Quartz作業(yè)調(diào)度基本使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Spring Cloud 系列之注冊中心 Eureka詳解

    Spring Cloud 系列之注冊中心 Eureka詳解

    Netflix Eureka 是由 Netflix 開源的一款基于 REST 的服務(wù)發(fā)現(xiàn)組件,包括 Eureka Server 及 Eureka Client。這篇文章主要介紹了Spring Cloud 系列之注冊中心 Eureka,需要的朋友可以參考下
    2020-11-11
  • Spring之spring-context-indexer依賴詳解

    Spring之spring-context-indexer依賴詳解

    這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11

最新評論