精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊天產生的文件太多了,這該怎么處理?

開發 前端
官話:策略模式(Strategy Pattern):定義一系列算法類,將每一個算法封裝起來,并讓它們可以相互替換,策略模式讓算法獨立于使用它的客戶而變化。

前言

最近工作上有一個保存企業微信聊天記錄的需求,遇到一些問題,數據量太大了,該怎么存?存儲之后要檢索,怎么才能檢索的快呢?聊天產生的文件太多了,怎么去重?需求一句話,可是苦了開發人員了。

以后有時間指北君會整理一下做這個功能的問題和解決方法,今天就拿其中一個問題來分析,使用策略模式來解決問題,沒有了解過策略模式或者長時間不用已經忘了策略模式的小伙伴先來簡單了解一下策略模式吧。

什么是策略模式

官話:策略模式(Strategy Pattern):定義一系列算法類,將每一個算法封裝起來,并讓它們可以相互替換,策略模式讓算法獨立于使用它的客戶而變化。

簡單理解就是,針對不同的場景,使用不同的策略進行處理。

優點

  • 算法可以自由切換。
  • 避免使用多重條件判斷。
  • 擴展性良好。

缺點

  • 策略類會增多。
  • 所有策略類都需要對外暴露。

使用場景

  • 如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個對象在許多行為中選擇一種行為。
  • 一個系統需要動態地在幾種算法中選擇一種。
  • 如果一個對象有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇語句來實現。

結構圖

圖片

策略模式結構圖

策略模式的簡單示例

場景:最近太熱了,想要降降溫,有什么辦法呢?

首先,定義一個降溫策略的接口。

public interface CoolingStrategy {

/**
* 處理方式
*/
void handle();

}

定義3種降溫策略;實現策略接口;

public class IceCoolingStrategy implements CoolingStrategy {
@Override
public void handle() {
System.out.println("使用冰塊降溫");
}
}
public class FanCoolingStrategy implements CoolingStrategy {

@Override
public void handle() {
System.out.println("使用風扇降溫");
}
}
public class AirConditionerCoolingStrategy implements CoolingStrategy {
@Override
public void handle() {
System.out.println("使用空調降溫");
}
}

定義一個降溫策略的上下文;

public class CoolingStrategyContext {

private final CoolingStrategy strategy;

public CoolingStrategyContext(CoolingStrategy strategy) {
this.strategy = strategy;
}

public void coolingHandle() {
strategy.handle();
}

}

測試;

public class Main {
public static void main(String[] args) {

CoolingStrategyContext context = new CoolingStrategyContext(new FanCoolingStrategy());
context.coolingHandle();

context = new CoolingStrategyContext(new AirConditionerCoolingStrategy());
context.coolingHandle();

context = new CoolingStrategyContext(new IceCoolingStrategy());
context.coolingHandle();
}
}

運行結果:

使用風扇降溫
使用空調降溫
使用冰塊降溫

以上就是一個策略模式的簡單實現。

策略模式的項目實戰

場景

以我自己在工作中遇到的場景為例,《企業微信會話存檔》功能,獲取各種格式的消息內容,進行解析并保存數據。這里只針對消息處理的功能模塊,其他關于《企業微信會話存檔》的功能,有時間整理一下再發出來。

企業微信會話聊天會產生如下多種消息,在SpringBoot項目中應該如何使用策略模式來完成消息的解析呢?

圖片

企業微信消息格式

獲取會話內容 - API 看API內容,數據都是json格式。思考應該如何處理:

  • 首先,既然要解析各種數據,而每種數據格式結構都不一樣,那么就需要先根據每種消息格式定義各自的對象,然后根據不同的需求,將json格式處理成pojo對象;
  • 根據場景,需要定義兩個策略接口,一個是針對普通的文本格式消息的策略,另一個則是需要處理文件格式消息的策略;
  • 定義策略處理上下文操作類,用于使用策略;
  • 每種消息,都會有一些相同的數據,比如發送人、接收人、消息類型等;根據消息類型的不同,使用 key-value 的方式,讓調用者確定應該使用哪個策略來處理數據;
  • 因為格式太多,這里只使用兩個格式作為例子;

實現

兩個策略接口;

public interface Strategy {
/**
* 處理會話存檔的內容
*
* @param content json格式的消息內容
* @return 結果
*/
<T> T handleContent(String content);
}
public interface MediaStrategy {
/**
* 處理會話存檔媒體內容
*
* @param msgData 消息內容
*/
<T> void handleMedia(T msgData);
}

策略的具體實現(偽代碼);

@Component("link")
public class LinkStrategy implements Strategy {

@Override
public LinkPO handleContent(String content) {
// JSON 轉換為具體對象
LinkWrapDTO linkWrapDTO = JacksonUtils.json2Obj(content, LinkWrapDTO.class);
// 將對象處理成業務需要的格式
return Convert.convert(LinkPO.class, linkWrapDTO);
}
}
@Component("image")
public class ImageStrategy implements Strategy, MediaStrategy {

@Autowired
private IMsgFileService msgFileService;

@Override
public ImagePO handleContent(String content) {
// JSON 轉換為具體對象
ImageWrapDTO imageWrapDTO = JacksonUtils.json2Obj(content, ImageWrapDTO.class);
// 將對象處理成業務需要的格式
return Convert.convert(ImagePO.class,imageWrapDTO);
}

@Override
public <T> void handleMedia(T msgData) {
// 將數據格式轉換為具體實現的數據格式
ImagePO imagePo = Convert.convert(ImagePO.class, msgData);
// 調用文件服務,進一步處理文件
msgFileService.newFileTask(imagePo.getImage().getSdkfileid(),
imagePo.getMsgid() + ".jpg", imagePo.getMsgid(), imagePo.getSeq(),
imagePo.getImage().getFilesize(), imagePo.getImage().getMd5sum(), MessageEnum.IMAGE);
}
}

策略上下文;

@Component
public class StrategyContext {

@Resource
Map<String, Strategy> strategys = new ConcurrentHashMap<>();

@Resource
Map<String, MediaStrategy> mediaStrategys = new ConcurrentHashMap<>();

public Strategy getStrategy(String component) {
return strategys.get(component);
}

public MediaStrategy getMediaStrategy(String component) {
return mediaStrategys.get(component);
}
}

使用方式(偽代碼);

public class MsgService {
@Resource
private StrategyContext strategyContext;

public void handlerMessage() {
// 請求api獲取消息的json
json = api();
// 轉為通用格式對象
basePo = JsonUtils.json2Obj(json, BasePO.class);
// 選取不同的策略
Strategy strategy = strategyContext.getStrategy(basePo.getMsgType());
// 進行處理
strategy.handleContent(json);
// 關于文件類消息的處理
MediaStrategy mediaStrategy = strategyContext.getMediaStrategy(basePo.getMsgtype());
if (null != mediaStrategy) {
mediaStrategy.handleMedia(basePo);
}
}
}

以上就是策略模式的一種實現方式;

使用策略模式來處理不同格式的消息,雖然多了很多策略類,但是讓整個功能模塊的代碼變得清晰,松耦合,而且很容易擴展和修改,并不會影響其他流程。

小結

從以上的例子很明顯的可以看出,策略模式的靈活性;如果此時企業微信提供了一種新的消息格式,那么根本無需修改之前的代碼,只需要再寫一個新的類,實現消息處理策略的接口,重寫處理方法即可;

了解策略模式的優點和缺點,合理的使用策略模式,會讓你的代碼更加的整潔優雅。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2019-11-19 16:10:24

面試官Java編程語言

2013-01-15 09:36:33

交換機串聯網絡

2015-10-16 14:46:36

數據中心節水水消耗

2011-10-14 10:37:47

虛擬機 負載

2023-07-31 06:57:27

自主處理器架構8核心

2020-05-25 15:40:23

IntelliJ IDEclipse強Java

2011-05-31 09:54:18

項目經理

2011-11-19 14:58:19

云計算

2024-08-20 09:42:38

2015-07-29 17:02:16

2025-11-06 13:56:45

AI谷歌模型

2020-08-27 14:05:32

TypeScript配置文件前端

2023-03-26 00:48:14

CPUSQL性能

2018-01-23 10:52:50

程序員技能互聯網

2017-06-15 08:02:02

庫存扣減查詢

2022-05-10 07:31:49

消息隊列CPUQPS

2018-10-23 10:28:01

服務器流量高并發

2016-09-09 13:25:01

Linux

2020-05-19 16:36:50

漏洞iOS網絡攻擊

2021-05-18 16:11:19

Windows 10Windows微軟
點贊
收藏

51CTO技術棧公眾號

免费一区二区三区| 91精品国产综合久久久久久漫画| 国产精品我不卡| 日韩欧美三级视频| 人人精品视频| 色综合天天视频在线观看| 日韩免费一区二区三区| 国产精品-色哟哟| 欧美成人精品| 日韩成人中文字幕| 中文字幕在线观看第三页| 天堂地址在线www| 国产精品一区二区你懂的| 国外成人在线直播| 日韩一区二区精品| 不卡视频在线| 亚洲色偷精品一区二区三区| melody高清在线观看| 免费成人av在线播放| 久久电影一区二区| 懂色av粉嫩av蜜乳av| 国产成人77亚洲精品www| 亚洲精品中文在线| 91国偷自产一区二区使用方法| 国产啪精品视频网站| 青青草手机在线视频| 亚洲欧美日本伦理| 日韩一区二区在线播放| 青青青在线播放| 97超碰资源站在线观看| 99久久99久久精品国产片果冻 | 亚洲欧美日韩电影| 精品视频一区在线| 99re只有精品| 免费视频一区二区| 欧美一区三区三区高中清蜜桃| 可以免费看av的网址| 一区二区导航| 欧美成人免费网站| 男生操女生视频在线观看| 在线观看爽视频| 一区二区三区日韩欧美精品| 亚洲最大色综合成人av| 免费在线黄色影片| 成人午夜视频网站| 亚洲一区美女视频在线观看免费| 超碰在线免费97| 国产精品久久久久久久久久妞妞 | a级片在线免费| 亚洲人妖av一区二区| 日韩欧美国产二区| 免费福利在线观看| 91免费看片在线观看| 国产精品视频免费观看| 亚洲av无码国产精品永久一区 | 欧美成人片在线| av午夜精品一区二区三区| 91精品黄色| 国产浮力第一页| 国产一区二区在线观看免费| 91精品久久久久久久久不口人| 波多野结衣大片| 视频一区欧美精品| 国产精品盗摄久久久| 男人天堂2024| 老司机久久99久久精品播放免费| 欧美一区二区色| 国产香蕉视频在线| 国产欧美精品| 热99精品里视频精品| 国产精品人人人人| 久久久久国产精品一区三寸| 日本亚洲欧美三级| 黄色av网站免费| 奇米精品一区二区三区在线观看 | jizz国产在线观看| 日韩电影在线观看一区| 国产精品视频xxx| 一区二区三区免费在线视频| 国精产品一区一区三区mba桃花 | 国产视频在线观看免费| 国产麻豆91精品| 成人欧美一区二区三区在线观看 | 国产成人在线电影| 国产欧美综合精品一区二区| 日本五码在线| 国产精品视频看| 中文字幕在线亚洲精品| 性xxxxfjsxxxxx欧美| 亚洲二区在线视频| 免费裸体美女网站| 在线观看亚洲精品福利片| 欧美日韩的一区二区| 先锋资源在线视频| 欧美国产极品| 中文字幕在线亚洲| 久久久精品国产sm调教| 欧美专区18| 国产一区视频在线| 亚洲av无码国产精品久久不卡| 91日韩在线专区| 亚洲无玛一区| 91豆花视频在线播放| 91极品视觉盛宴| 久久精品无码一区二区三区毛片| 欧美日日夜夜| 国产一区二区三区在线观看视频| 国产67194| 国产精品一二| 91精品视频在线看| av女名字大全列表| 亚洲视频一区在线| av之家在线观看| 亚洲国产一区二区久久| 亚洲国产一区二区三区在线观看| 91无套直看片红桃在线观看| 伊人激情综合| 91精品久久久久久久久久另类| www.五月婷婷| 中文字幕精品三区| 熟女少妇在线视频播放| 婷婷激情成人| 亚洲欧洲美洲在线综合| 色在线观看视频| 久久激情一区| 国产丝袜不卡| 91中文在线| 欧美三级日本三级少妇99| 成人性生活免费看| 欧美精品国产一区二区| 国产精品久久网| 五月婷婷狠狠干| 亚洲精品国产a| 亚洲综合色在线观看| 无码少妇一区二区三区| 久久99久久99精品中文字幕| 中文字幕有码视频| 久久久久九九视频| 亚洲人精品午夜射精日韩| 日韩激情综合| 久久艳片www.17c.com| 亚洲精品国产无码| 91在线观看视频| 无码粉嫩虎白一线天在线观看| 国产精品美女久久久久| 中文国产成人精品| www.国产一区二区| 91尤物视频在线观看| youjizz.com在线观看| 综合久久av| 日韩中文字幕国产| 国模私拍一区二区| 国产欧美一区二区在线观看| 日韩久久一级片| 欧洲亚洲一区二区三区| 久久免费高清视频| 人妻精品一区二区三区| 亚洲一区二区偷拍精品| 韩国三级在线播放| 欧美成人国产| 国产精品美女xx| 888av在线视频| 亚洲а∨天堂久久精品9966| 国产性70yerg老太| 成人av在线一区二区| 免费拍拍拍网站| 精品伊人久久久| 欧美专区在线视频| 国产一区二区三区福利| 欧美综合天天夜夜久久| 91狠狠综合久久久久久| 久久精品免费观看| 天天综合中文字幕| 欧美成年网站| 久久久久亚洲精品| 日本韩国免费观看| 欧美小视频在线| 亚洲女优在线观看| 奇米777欧美一区二区| 伊甸园精品99久久久久久| 亚洲国产天堂| 久久露脸国产精品| 国产小视频免费在线网址| 欧美色综合网站| 国产67194| 91最新地址在线播放| 午夜久久久精品| 一二三区不卡| 精品不卡在线| 日本欧美一区| 欧美刺激性大交免费视频| 少妇人妻偷人精品一区二区| 91精品办公室少妇高潮对白| 老湿机69福利| 91蝌蚪porny| 国产一区二区在线观看免费视频| 午夜精品亚洲| 欧美日韩亚洲一区二区三区四区| 欧美91在线|欧美| 久久久人成影片一区二区三区| 国产一级片在线播放| 91精品国产91综合久久蜜臀| 久热这里只有精品6| 国产精品传媒视频| www.超碰97| 韩国一区二区在线观看| a级黄色一级片| 日韩欧美高清在线播放| 国产精品大全| 巨大黑人极品videos精品| 久久久久久久久久久成人| 北岛玲日韩精品一区二区三区| 日韩精品专区在线影院观看| 日本黄色一级视频| 一个色在线综合| 免费黄在线观看| 成人禁用看黄a在线| 国产精品区在线| 亚洲欧美视频一区二区三区| 精品人妻人人做人人爽| 精品一二三区| 激情伦成人综合小说| 国产95亚洲| 国产精品日韩欧美综合| 欧美办公室脚交xxxx| 久久中国妇女中文字幕| 韩日在线视频| 日韩av最新在线| 亚洲经典一区二区三区| 欧美狂野另类xxxxoooo| 国产精品久久久久久人| 婷婷国产在线综合| 永久免费看黄网站| 最新中文字幕一区二区三区| 国产1区2区在线观看| 99国产精品久久久久久久久久久| 三级黄色片播放| 精品一区二区三区在线播放视频 | 蜜臀a∨国产成人精品| 男人天堂1024| 亚洲国产美女| 国产91在线亚洲| 艳女tv在线观看国产一区| 亚洲一区二区三区免费看| 欧美日韩国产传媒| 欧美成熟毛茸茸复古| 女同久久另类99精品国产| 国产九色精品| 综合成人在线| 成人蜜桃视频| gogo人体一区| 国产精品10p综合二区| 97成人在线| 国产精品午夜av在线| 国产一区二区三区亚洲| 99在线视频播放| 在线精品视频一区| 5566中文字幕一区二区| 久久99成人| 999视频在线观看| **爰片久久毛片| 国产精品果冻传媒潘| 理论片一区二区在线| 激情久久av| 欧美精品第一区| 日韩欧美一区二区三区久久婷婷| 精品色999| 精品一区二区成人免费视频 | 一级黄色av片| 欧美亚洲综合在线| 亚洲综合网av| 91精品国产色综合久久不卡电影 | 久久69国产一区二区蜜臀| 我要看一级黄色大片| 麻豆成人久久精品二区三区红| 夜夜夜夜夜夜操| 国产成人自拍网| 性久久久久久久久久久| 久久色成人在线| 在线国产视频一区| 欧美国产一区在线| 亚洲一级二级片| 久久久夜精品| 91精品国产一区| 日本在线影院| 国产精品久久久久久久久久久久久久| 国产精品久久乐| 成人免费91在线看| 亚洲另类春色校园小说| 亚洲美女搞黄| 亚洲国产高清一区二区三区| 国产精品无码av无码| 精品一区二区久久| chinese麻豆新拍video| 国产精品日产欧美久久久久| 欧美高清视频一区二区三区| 欧美日韩性视频| 亚洲最大成人在线视频| 亚洲国产天堂网精品网站| 中文字幕在线观看日本| 久久久久中文字幕| 小明成人免费视频一区| 99久热re在线精品视频| 精品国产乱码久久久久久蜜坠欲下| 99热一区二区三区| 欧美一区=区| 99热这里只有精品2| 久久精品夜色噜噜亚洲aⅴ| 欧美人妻精品一区二区免费看| 色噜噜狠狠成人中文综合| 亚洲成人一二三区| 中文字幕亚洲二区| 蜜桃av.网站在线观看| 亚洲伊人久久综合| 精品国产一区二区三区小蝌蚪| 丰满的少妇愉情hd高清果冻传媒 | 污色网站在线观看| 97se亚洲国产综合在线| 日本中文字幕免费在线观看| 在线精品视频一区二区三四| 三级小视频在线观看| www.日韩av.com| 搜成人激情视频| 国产精品久久久久久久久久直播 | 伦伦影院午夜日韩欧美限制| 97se综合| 999精品在线观看| 国产精品99久久| 久久久免费视频网站| 狠狠色狠狠色综合日日91app| 亚洲一区二区自偷自拍 | 日韩不卡在线播放| 91精品免费在线观看| 欧美拍拍视频| 91国产美女视频| 日韩精品视频中文字幕| 久久久久久久久久久久久久一区| 亚欧美无遮挡hd高清在线视频| 国产精品亚洲a| 99精品欧美一区二区三区小说| 中文字幕人妻一区二| 色欧美88888久久久久久影院| 殴美一级特黄aaaaaa| 久久影院资源网| 亚洲欧洲二区| 亚洲 国产 日韩 综合一区| 一区在线视频| 韩国三级hd两男一女| 亚洲男同性视频| 国产三级按摩推拿按摩| 在线午夜精品自拍| 大桥未久在线视频| 国产精品一 二 三| 综合久久久久| 无码人妻少妇色欲av一区二区| 国产嫩草影院久久久久| 偷偷操不一样的久久| 精品视频—区二区三区免费| 都市激情久久综合| 国产视频不卡| 亚洲国产高清视频| 菠萝菠萝蜜网站| 婷婷国产在线综合| 天天干天天舔天天射| 欧美在线视频网站| 天堂99x99es久久精品免费| 国产1区2区在线| 久久久不卡网国产精品一区| 久久久久久久中文字幕| 亚洲高清一二三区| gogo久久| 日韩av电影免费在线| 天堂资源在线中文精品| 国产在线观看h| 欧美日韩中文精品| 麻豆最新免费在线视频| 91日韩久久| 精品动漫av| 中文字幕丰满孑伦无码专区| 欧美视频精品一区| 在线毛片网站| 91系列在线播放| 国内视频精品| 亚洲激情视频小说| 欧美综合亚洲图片综合区| 成人影院在线观看| 成人欧美一区二区三区在线观看| 亚洲一区中文| av电影在线不卡| 在线观看日产精品| sm国产在线调教视频| 91在线看网站| 丝袜美腿亚洲色图| 日韩黄色中文字幕| 精品奇米国产一区二区三区| 捆绑调教日本一区二区三区| 欧美久久综合性欧美| 国产乱对白刺激视频不卡| 日本a在线观看| 在线观看国产精品淫|