作者:京東工業(yè) 孫磊
一、概念
策略模式(Strategy Pattern)也稱為(Policy Parttern)。 它定義了算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變換,不會影響到使用算法的客戶。策略模式屬性行為模式。
二、實際應(yīng)用
業(yè)務(wù)場景:業(yè)務(wù)需要監(jiān)聽多種消息,將接收到的消息更新到同一個ES中,不同的消息類型使用不同的策略處理,補充不同的數(shù)據(jù)信息,更新到ES中,供商家搜索和統(tǒng)計使用。
代碼實現(xiàn)結(jié)合spring框架、簡單工廠和策略模式一起使用。
public interface GatherExecuteService {
/**
* 處理消息體
*
* @param gatherDataVo
*/
boolean execute(GatherDataVo gatherDataVo);
}
多個實現(xiàn)類
// 價格策略實現(xiàn)
@Service
public class PriceExecuteServiceImpl implements GatherExecuteService {
@Override
public boolean execute(GatherDataVo gatherDataVo) {
.....具體實現(xiàn)代碼省略
}
}
// 商品策略實現(xiàn) @Service public class ProductExecuteServiceImpl implements GatherExecuteService { @Override public boolean execute(GatherDataVo gatherDataVo) { .....具體實現(xiàn)代碼省略 } }
// 庫存策略實現(xiàn)
@Service
public class StockExecuteServiceImpl implements GatherExecuteService {
@Override
public boolean execute(GatherDataVo gatherDataVo) {
.....具體實現(xiàn)代碼省略
}
}
使用枚舉存儲策略實現(xiàn)bean
@Getter
@AllArgsConstructor
public enum MessageTypeEnum {
PRODUCT(0, "productExecuteServiceImpl", "商品基本信息消息"),
PRICE(1, "priceExecuteServiceImpl", "價格消息"),
STOCK(2, "stockExecuteServiceImpl", "庫存消息") ;
private int type;
private String service;
private String description;
public static String getServiceName(int type) {
MessageTypeEnum[] typeEnums = MessageTypeEnum.values();
for (MessageTypeEnum enumType : typeEnums) {
if (enumType.getType() == type) {
return enumType.getService();
}
}
return null;
}
}
使用到不同策略的代碼
// 根據(jù)消息類型獲取不同策略類,然后使用spring的ApplicationContext獲取bean,達到執(zhí)行不同策略的目的。 String serviceName = MessageTypeEnum.getServiceName(gatherDataVo.getMessageType()); if (StringUtils.isNotBlank(serviceName)) { GatherExecuteService gatherExecuteService = (GatherExecuteService) SpringContextUtil.getBean(serviceName, GatherExecuteService.class); }
策略模式是一種比較簡單的設(shè)計模式,工作中經(jīng)常和其他設(shè)計模式一塊使用。簡單的應(yīng)用記錄分享一下。
審核編輯 黃宇
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
代碼
+關(guān)注
關(guān)注
30文章
4976瀏覽量
74375
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
一文詳解前端常用設(shè)計模式
設(shè)計模式一直是程序員談?wù)摰摹案叨恕痹掝}之一,總有一種敬而遠之的心態(tài)。在了解后才知道在將函數(shù)作為一等對象的語言中,有許多需要利用對象多態(tài)性的設(shè)計模式,比如單例模式、 策略
關(guān)于LVOOP設(shè)計模式的框架問題?
1. 請問目前的很多設(shè)計模式,比如簡單工廠模式,策略模式之類的,labview是不是沒有框架,需要自己手工去實現(xiàn)?2. labview的actor framework是不是目前l(fā)abv
發(fā)表于 08-07 23:14
封裝變化與面向接口編程
在使用Java的集合框架中,經(jīng)常需要通過構(gòu)造方法傳入一個比較器Comparator或者創(chuàng)建比較器傳入Collections的靜態(tài)方法中作為方法參數(shù),進行比較排序等,這其實就是策略模式的應(yīng)用。策略
發(fā)表于 11-28 15:04
?7592次閱讀
設(shè)計模式最佳實踐探索—策略模式
根據(jù)不同的應(yīng)用場景與意圖,設(shè)計模式主要分為創(chuàng)建型模式、結(jié)構(gòu)型模式和行為型模式三類。本文主要探索行為型模式中的
為什么我不再推薦枚舉策略模式?
我們可以看到經(jīng)典方法,創(chuàng)建了一個接口、三個策略類,還是比較啰嗦的。調(diào)用類的實現(xiàn)也待商榷,新增一個策略類還要修改榜單實例(可以用抽象工廠解決,但是復(fù)雜度又上升了)。加之我們有更好的選擇,所以此處不再推薦經(jīng)典策略
基于輸入阻抗控制的多模式混合PFC的控制策略
簡單地說,混合PFC的控制策略就是操縱開關(guān)頻率在正弦電壓內(nèi)進行變化來進行跨越多個區(qū)域,難點是多模式區(qū)域的增益不會統(tǒng)一,實現(xiàn)多模式優(yōu)秀的電流控制效果就是難題
如何通過策略模式簡化if-else
相信大家日常開發(fā)中會經(jīng)常寫各種分支判斷語句,比如 if-else ,當(dāng)分支較多時,代碼看著會比較臃腫,那么如何優(yōu)化呢? 1、什么是策略模式? Define a family
Java 枚舉與策略模式、函數(shù)式接口的結(jié)合:實現(xiàn)高內(nèi)聚低耦合的設(shè)計
中,通常會使用枚舉來定義業(yè)務(wù)上的一組常量,那除了簡單地定義常量之外,我們?nèi)绾卫妹杜e來實現(xiàn)高內(nèi)聚、低耦合的設(shè)計呢?下面介紹下枚舉和策略模式、函數(shù)式接口的組合應(yīng)用。 二、枚舉+策略模式
設(shè)計模式-策略模式
評論