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

為什麼使用策略模式?

答:策略模式是解決過多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策略模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: