使用spring外掛實現策略模式

banq發表於2021-10-25

策略模式是一種行為設計模式,可讓您定義一系列演算法/實現並允許在執行時選擇它們。  

假設我們有一個支援不同支付型別的支付服務,如信用卡、貝寶、條紋等。我們想根據使用者請求決定使用哪種支付方式。讓我們開始實施。

 

新增spring外掛依賴:

<dependency> 
  <groupId> org.springframework.plugin </groupId> 
  <artifactId> spring-plugin-核心</artifactId> 
  <version> 2.0.0.RELEASE </version>
</dependency> 

支付外掛程式碼:

import org.springframework.plugin.core.Plugin;

public interface PaymentPlugin extends Plugin<PaymentMethod> {

  void pay(int paymentAmount);

}

PaymentPlugin 介面是我們定義合約的基本介面。這裡我們需要擴充套件外掛並傳遞一個類型別作為用於解析外掛(實現)的型別引數。

這裡 PaymentMethod 是一個列舉,它包含不同型別的支付方式。

我們來看看Spring外掛的

Plugin
內部介面:

package org.springframework.plugin.core;
public interface Plugin<S> {
  boolean supports(S var1);
}

下面是 PaymentPlugin對其的一種實現:

import org.springframework.stereotype.Component;

import lombok.extern.slf4j.Slf4j;

@Component
@Slf4j
public class PayByPaypal implements PaymentPlugin {

  @Override
  public void pay(int paymentAmount) {
    log.info("Paid by paypal, amount: " + paymentAmount);
  }

  @Override
  public boolean supports(PaymentMethod paymentMethod) {
    return paymentMethod == PaymentMethod.PAYPAL;
  }
}

我們必須覆蓋 pay 方法和 support 方法,pay 方法包含需要執行的演算法/業務邏輯,支援外掛介面附帶的方法決定是否應該根據給定的分隔符呼叫外掛(在我們的例子中為 PaymentPlugin) . 我新增了另一個類 PayByCard 來模擬通過卡功能支付。接下來我們將使用一個服務類來註冊我們的外掛並使用它。

package com.rkdevblog.plugin;

import java.util.Optional;

import org.springframework.plugin.core.PluginRegistry;
import org.springframework.plugin.core.config.EnablePluginRegistries;
import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@Service
@EnablePluginRegistries(PaymentPlugin.class)
@RequiredArgsConstructor
public class PaymentService {

  private final PluginRegistry<PaymentPlugin, PaymentMethod> plugins;

  public PaymentPlugin choosePaymentMethod(PaymentMethod paymentMethod) {

    Optional<PaymentPlugin> pluginFor = plugins.getPluginFor(paymentMethod);
    if (pluginFor.isPresent()) {
      return pluginFor.get();
    }
    throw new UnsupportedOperationException("No such payment method");
  }
  
}

在服務類中,我們通過使用@EnablePluginRegistries 為配置的外掛型別啟用 PluginRegistry 例項,注入 PluginRegistry 並使用它通過傳遞 PaymentMethod 來選擇外掛,PaymentMethod 將相應地返回 PaymentPlugin 的例項。

 

現在讓我們執行應用程式並檢視,在主類中呼叫 PaymentService 並傳遞您需要的 PaymentMethod 並檢查日誌輸出。 

測試PaymentMethod Card :

@Bean
ApplicationRunner runner(PaymentService paymentService) {
  return args -> {
    PaymentPlugin paymentPlugin = paymentService.choosePaymentMethod(PaymentMethod.CARD);

    paymentPlugin.pay(10);
  };
}

 

測試PaymentMethod Paypal:

@Bean
ApplicationRunner runner(PaymentService paymentService) {
  return args -> {
    PaymentPlugin paymentPlugin = paymentService.choosePaymentMethod(PaymentMethod.PAYPAL);

    paymentPlugin.pay(10);
  };
}

 

程式碼下載:https://github.com/Rajithkonara/spring-plugin

 

相關文章