日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
原來使用Spring實現(xiàn)策略模式可以這么簡單!

 本文轉(zhuǎn)載自微信公眾號「Java極客技術(shù)」,作者鴨血粉絲 。轉(zhuǎn)載本文請聯(lián)系Java極客技術(shù)公眾號。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)秦皇島免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了1000多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

Hello,大家好,我是鴨血粉絲~

最近看同事的代碼時候,學(xué)到了個小技巧,在某些場景下非常挺有用的,這里分享一下給大家。

Spring 中 @Autowired注解,大家應(yīng)該不會陌生,用過 Spring 的肯定也離不開這個注解,通過這個注解可以幫我們自動注入我們想要的 Bean。

除了這個基本功能之外,@Autowired 還有更加強大的功能,還可以注入指定類型的數(shù)組,List/Set 集合,甚至還可以是 Map 對象。

比如說當(dāng)前應(yīng)用有一個支付接口 PayService,分別需要對接支付寶、微信支付、銀行卡,所以分別有三個不同實現(xiàn)類 AliPayService,WechatPayservice,BankCardPayService。

四個類的關(guān)系如下圖所示:

如果此時我需要獲取當(dāng)前系統(tǒng)類所有 PayService Bean,老的方式我們只能通過 BeanFactory或者 ApplicationContext 獲取。

 
 
 
 
  1. // 首先通過 getBeanNamesForType 獲取 PayService 類型所有的 Bean 
  2. String[] names = ctx.getBeanNamesForType(PayService.class); 
  3. List anotherPayService = Lists.newArrayList(); 
  4. for (String beanName : names) { 
  5.     anotherPayService.add(ctx.getBean(beanName, PayService.class)); 
  6. // 或者通過 getBeansOfType 獲取所有 PayService 類型 
  7. Map beansOfType = ctx.getBeansOfType(PayService.class); 
  8. for (Map.Entry entry : beansOfType.entrySet()) { 
  9.     anotherPayService.add(entry.getValue()); 

但是現(xiàn)在我們可以不用這么麻煩了,我們可以直接使用 @Autowired 注入 PayService Bean 數(shù)組,或者 PayService List/Set 集合,甚至,我們還可以注入 PayService 的 Map 集合。

 
 
 
 
  1. @Autowired 
  2. List payServices; 
  3.  
  4. @Autowired 
  5. PayService[] payServicesArray; 

知道了這個功能,當(dāng)我們需要使用 Spring 實現(xiàn)策略模式就非常簡單。

可能有的小伙伴不太了解策略模式,沒關(guān)系,這類阿粉介紹一個業(yè)務(wù)場景,通過這個場景給大家介紹一下策略模式。

還是上面的例子,我們當(dāng)前系統(tǒng)需要對接微信支付、支付寶、以及銀行卡支付。

當(dāng)接到這個需求,我們首先需要拿到相應(yīng)接口文檔,分析三者的共性。

假設(shè)我們這里發(fā)現(xiàn),三者模式比較類似,只是部分傳參不一樣。

所以我們根據(jù)三者的共性,抽象出一組公共的接口 PayService,

 
 
 
 
  1. public interface PayService { 
  2.     PayResult epay(PayRequest request); 

然后分別實現(xiàn)三個實現(xiàn)類,都繼承這個接口。

那么現(xiàn)在問題來了,由于存在三個實現(xiàn)類,如何選擇具體的實現(xiàn)類?

其實這個問題很好解決,請求參數(shù)傳入一個唯一標(biāo)識,然后我們根據(jù)標(biāo)識選擇相應(yīng)的實現(xiàn)類。

比如說我們在請求類 PayRequest 搞個 channelNo 字段,這個代表相應(yīng)支付渠道唯一標(biāo)識,比如說支付寶為:00000001,微信支付為 00000002,銀行卡支付為 00000003。

接著我們需要把唯一標(biāo)識與具體實現(xiàn)類一一映射起來,剛好我們可以使用 Map 存儲這種映射關(guān)系。

我們實現(xiàn)一個 RouteService,具體代碼邏輯如下:

 
 
 
 
  1. @Service 
  2. public class RouteService { 
  3.  
  4.     @Autowired 
  5.     Map payServiceMap; 
  6.  
  7.     public PayResult epay(PayRequest payRequest) { 
  8.         PayService payService = payServiceMap.get(payRequest.getChannelNo()); 
  9.         return  payService.epay(payRequest); 
  10.     } 
  11.  

我們在 RouteService 自動注入 PayService 所有相關(guān) Bean,然后使用唯一標(biāo)識查找實現(xiàn)類。

這樣我們對外就屏蔽了支付渠道的差異,其他服務(wù)類只要調(diào)用 RouteService 即可。

但是這樣實現(xiàn)還是有點小問題,由于我們唯一標(biāo)識為一串?dāng)?shù)字,如果像我們上面直接使用 @Autowired注入 Map,這就需要我們實現(xiàn)類的 Bean 名字為 00000001 這些。

但是這樣命名不是很優(yōu)雅,這樣會讓后來同學(xué)很難看懂,不好維護。

所以我們需要做個轉(zhuǎn)換,我們可以這么實現(xiàn)。

首先我們改造一下 PayService 這個接口,增加一個方法,每個具體實現(xiàn)類通過這個方法返回其唯一標(biāo)識。

 
 
 
 
  1. public interface PayService { 
  2.  
  3.     PayResult epay(PayRequest request); 
  4.  
  5.     String channel(); 

具體舉個支付寶實現(xiàn)類的代碼,其他實現(xiàn)類實現(xiàn)類似。

 
 
 
 
  1. @Service("aliPayService") 
  2. public class AliPayService implements PayService { 
  3.  
  4.     @Override 
  5.     public PayResult epay(PayRequest request) { 
  6.         // 業(yè)務(wù)邏輯 
  7.         return new PayResult(); 
  8.     } 
  9.     @Override 
  10.     public String channel() { 
  11.         return "00000001"; 
  12.     } 

最后我們改造一下 RouteService,具體邏輯如下:

 
 
 
 
  1. @Service 
  2. public class RouteService { 
  3.  
  4.     @Autowired 
  5.     Set payServiceSet; 
  6.      
  7.     Map payServiceMap; 
  8.  
  9.     public PayResult epay(PayRequest payRequest) { 
  10.         PayService payService = payServiceMap.get(payRequest.getChannelNo()); 
  11.         return  payService.epay(payRequest); 
  12.     } 
  13.  
  14.     @PostConstruct 
  15.     public void init() { 
  16.         for (PayService payService : payServiceSet) { 
  17.             payServiceMap = new HashMap<>(); 
  18.             payServiceMap.put(payService.channel(), payService); 
  19.         } 
  20.     } 

上面代碼首先通過自動注入 PayService 一個集合,然后我們再將其轉(zhuǎn)為一個 Map,這樣內(nèi)部存儲剛好是唯一標(biāo)識與實現(xiàn)類的映射了。


本文題目:原來使用Spring實現(xiàn)策略模式可以這么簡單!
鏈接URL:http://www.dlmjj.cn/article/djocgoo.html