首頁 > 軟體

Java設計模式之策略模式案例詳解

2022-07-26 18:03:20

為什麼使用策略模式?

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

優缺點

優點

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

缺點

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

Spring中哪裡使用策略模式

ClassPathXmlApplicationContext Spring 底層Resource介面採用策略模式

Spring 為Resource 介面提供瞭如下實現類:

  • UrlResource:存取網路資源的實現類。
  • ClassPathResource:存取類載入路徑裡資源的實現類。
  • FileSystemResource:存取檔案系統裡資源的實現類。
  • ServletContextResource:存取相對於ServletContext 路徑裡的資源的實現類
  • InputStreamResource:存取輸入流資源的實現類。
  • ByteArrayResource:存取位元組陣列資源的實現類。

策略模式設計圖

  • Strategy::策略介面或者策略抽象類,並且策略執行的介面
  • ConcreateStrategyA、 B、C等:實現策略介面的具體策略類
  • Context::上下文類,持有具體策略類的範例,並負責呼叫相關的演演算法

程式碼案例

統一支付介面

public interface Payment {
    /**
     * 獲取支付方式
     *
     * @return 響應,支付方式
     */
    String getPayType();
    /**
     * 支付呼叫
     *
     * @param order 訂單資訊
     * @return 響應,支付結果
     */
    String pay(String order);
}

各種支付方式(策略)

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

使用工廠模式來建立策略

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

到此這篇關於Java設計模式之策略模式詳解的文章就介紹到這了,更多相關Java策略模式內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com