日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
聊天產(chǎn)生的文件太多了,這該怎么處理?

前言

最近工作上有一個(gè)保存企業(yè)微信聊天記錄的需求,遇到一些問(wèn)題,數(shù)據(jù)量太大了,該怎么存?存儲(chǔ)之后要檢索,怎么才能檢索的快呢?聊天產(chǎn)生的文件太多了,怎么去重?需求一句話(huà),可是苦了開(kāi)發(fā)人員了。

成都創(chuàng)新互聯(lián)專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站、網(wǎng)站重做改版、金山網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、電子商務(wù)商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為金山等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

以后有時(shí)間指北君會(huì)整理一下做這個(gè)功能的問(wèn)題和解決方法,今天就拿其中一個(gè)問(wèn)題來(lái)分析,使用策略模式來(lái)解決問(wèn)題,沒(méi)有了解過(guò)策略模式或者長(zhǎng)時(shí)間不用已經(jīng)忘了策略模式的小伙伴先來(lái)簡(jiǎn)單了解一下策略模式吧。

什么是策略模式

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

簡(jiǎn)單理解就是,針對(duì)不同的場(chǎng)景,使用不同的策略進(jìn)行處理。

優(yōu)點(diǎn)

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

缺點(diǎn)

  • 策略類(lèi)會(huì)增多。
  • 所有策略類(lèi)都需要對(duì)外暴露。

使用場(chǎng)景

  • 如果在一個(gè)系統(tǒng)里面有許多類(lèi),它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動(dòng)態(tài)地讓一個(gè)對(duì)象在許多行為中選擇一種行為。
  • 一個(gè)系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種。
  • 如果一個(gè)對(duì)象有很多的行為,如果不用恰當(dāng)?shù)哪J?,這些行為就只好使用多重的條件選擇語(yǔ)句來(lái)實(shí)現(xiàn)。

結(jié)構(gòu)圖

策略模式結(jié)構(gòu)圖

策略模式的簡(jiǎn)單示例

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

首先,定義一個(gè)降溫策略的接口。

public interface CoolingStrategy {

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

}

定義3種降溫策略;實(shí)現(xiàn)策略接口;

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

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

定義一個(gè)降溫策略的上下文;

public class CoolingStrategyContext {

private final CoolingStrategy strategy;

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

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

}

測(cè)試;

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();
}
}

運(yùn)行結(jié)果:

使用風(fēng)扇降溫
使用空調(diào)降溫
使用冰塊降溫

以上就是一個(gè)策略模式的簡(jiǎn)單實(shí)現(xiàn)。

策略模式的項(xiàng)目實(shí)戰(zhàn)

場(chǎng)景

以我自己在工作中遇到的場(chǎng)景為例,《企業(yè)微信會(huì)話(huà)存檔》功能,獲取各種格式的消息內(nèi)容,進(jìn)行解析并保存數(shù)據(jù)。這里只針對(duì)消息處理的功能模塊,其他關(guān)于《企業(yè)微信會(huì)話(huà)存檔》的功能,有時(shí)間整理一下再發(fā)出來(lái)。

企業(yè)微信會(huì)話(huà)聊天會(huì)產(chǎn)生如下多種消息,在SpringBoot項(xiàng)目中應(yīng)該如何使用策略模式來(lái)完成消息的解析呢?

企業(yè)微信消息格式

獲取會(huì)話(huà)內(nèi)容 - API 看API內(nèi)容,數(shù)據(jù)都是json格式。思考應(yīng)該如何處理:

  • 首先,既然要解析各種數(shù)據(jù),而每種數(shù)據(jù)格式結(jié)構(gòu)都不一樣,那么就需要先根據(jù)每種消息格式定義各自的對(duì)象,然后根據(jù)不同的需求,將json格式處理成pojo對(duì)象;
  • 根據(jù)場(chǎng)景,需要定義兩個(gè)策略接口,一個(gè)是針對(duì)普通的文本格式消息的策略,另一個(gè)則是需要處理文件格式消息的策略;
  • 定義策略處理上下文操作類(lèi),用于使用策略;
  • 每種消息,都會(huì)有一些相同的數(shù)據(jù),比如發(fā)送人、接收人、消息類(lèi)型等;根據(jù)消息類(lèi)型的不同,使用 key-value 的方式,讓調(diào)用者確定應(yīng)該使用哪個(gè)策略來(lái)處理數(shù)據(jù);
  • 因?yàn)楦袷教?,這里只使用兩個(gè)格式作為例子;

實(shí)現(xiàn)

兩個(gè)策略接口;

public interface Strategy {
/**
* 處理會(huì)話(huà)存檔的內(nèi)容
*
* @param content json格式的消息內(nèi)容
* @return 結(jié)果
*/
T handleContent(String content);
}
public interface MediaStrategy {
/**
* 處理會(huì)話(huà)存檔媒體內(nèi)容
*
* @param msgData 消息內(nèi)容
*/
void handleMedia(T msgData);
}

策略的具體實(shí)現(xiàn)(偽代碼);

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

@Override
public LinkPO handleContent(String content) {
// JSON 轉(zhuǎn)換為具體對(duì)象
LinkWrapDTO linkWrapDTO = JacksonUtils.json2Obj(content, LinkWrapDTO.class);
// 將對(duì)象處理成業(yè)務(wù)需要的格式
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 轉(zhuǎn)換為具體對(duì)象
ImageWrapDTO imageWrapDTO = JacksonUtils.json2Obj(content, ImageWrapDTO.class);
// 將對(duì)象處理成業(yè)務(wù)需要的格式
return Convert.convert(ImagePO.class,imageWrapDTO);
}

@Override
public void handleMedia(T msgData) {
// 將數(shù)據(jù)格式轉(zhuǎn)換為具體實(shí)現(xiàn)的數(shù)據(jù)格式
ImagePO imagePo = Convert.convert(ImagePO.class, msgData);
// 調(diào)用文件服務(wù),進(jìn)一步處理文件
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 strategys = new ConcurrentHashMap<>();

@Resource
Map 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() {
// 請(qǐng)求api獲取消息的json
json = api();
// 轉(zhuǎn)為通用格式對(duì)象
basePo = JsonUtils.json2Obj(json, BasePO.class);
// 選取不同的策略
Strategy strategy = strategyContext.getStrategy(basePo.getMsgType());
// 進(jìn)行處理
strategy.handleContent(json);
// 關(guān)于文件類(lèi)消息的處理
MediaStrategy mediaStrategy = strategyContext.getMediaStrategy(basePo.getMsgtype());
if (null != mediaStrategy) {
mediaStrategy.handleMedia(basePo);
}
}
}

以上就是策略模式的一種實(shí)現(xiàn)方式;

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

小結(jié)

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

了解策略模式的優(yōu)點(diǎn)和缺點(diǎn),合理的使用策略模式,會(huì)讓你的代碼更加的整潔優(yōu)雅。


文章標(biāo)題:聊天產(chǎn)生的文件太多了,這該怎么處理?
瀏覽地址:http://m.5511xx.com/article/cocioog.html