成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

考拉消息中心消息盒子處理重構(gòu)(策略模式)

ssshooter / 1199人閱讀

摘要:一消息中心簡(jiǎn)單介紹考拉的消息中心是負(fù)責(zé)發(fā)送和接受站內(nèi)信的服務(wù),比如營(yíng)銷系統(tǒng)發(fā)送的活動(dòng)消息,優(yōu)惠券到期消息等??祭械南⒅行娜肟谠谑醉摰挠疑辖恰2粌H僅如此,后面陸續(xù)增加了黑卡先生消息盒子和品牌動(dòng)態(tài)消息盒子,這兩個(gè)盒子的處理邏輯也都不相同。

本文由作者周敏敏授權(quán)網(wǎng)易云社區(qū)發(fā)布。

一.消息中心簡(jiǎn)單介紹

考拉app的消息中心是負(fù)責(zé)發(fā)送和接受app站內(nèi)信的服務(wù),比如營(yíng)銷系統(tǒng)發(fā)送的活動(dòng)消息,優(yōu)惠券到期消息等。考拉app中的消息中心入口在首頁的右上角。點(diǎn)擊進(jìn)去能夠看到消息盒子列表,點(diǎn)擊消息盒子能夠看到該盒子中的消息列表(有些盒子點(diǎn)擊是跳轉(zhuǎn)到特定URL)。

消息中心的功能簡(jiǎn)單來說只有提供接口發(fā)送消息、用戶接收查看消息兩類。

發(fā)送消息可分為發(fā)送私信、組播、廣播

接受查看消息可分為:

1.發(fā)消息時(shí),根據(jù)消息類型設(shè)置消息盒子的未讀計(jì)數(shù)(+1操作),最新文案,最新時(shí)間等

2.查詢返回消息盒子列表(正確返回每個(gè)盒子的未讀計(jì)數(shù),最新文案,最新時(shí)間)

3.點(diǎn)擊盒子,消除未讀消息數(shù)(當(dāng)前實(shí)現(xiàn)是只要點(diǎn)擊了盒子,就清空該盒子所有未讀消息數(shù)),返回盒子的消息列表(有些消息盒子是跳轉(zhuǎn)到特定url)

二.消息盒子越加越多,處理方式各不相同

剛接觸消息中心時(shí),只有活動(dòng)精選等6個(gè)消息盒子(處理邏輯相同,統(tǒng)稱為普通盒子),每個(gè)盒子的處理邏輯都一樣:

1.發(fā)消息時(shí),增加盒子未讀計(jì)數(shù)、消息ID塞入盒子的消息ID列表中、設(shè)置盒子的最新文案和時(shí)間

2.點(diǎn)擊盒子,清空盒子的未讀計(jì)數(shù)

3.進(jìn)入盒子,根據(jù)盒子的消息ID列表返回消息列表

如果一直是這樣,那將是很美好的,可惜……。在增加種草社區(qū)盒子的需求中,種草社區(qū)盒子的處理邏輯不同于普通盒子,大概要求:

1.種草社區(qū)盒子只作為查看種草消息的一個(gè)入口,消息體不存在消息中心,盒子上的未讀計(jì)數(shù)和文案由種草社區(qū)給出。

2.點(diǎn)擊種草社區(qū)盒子不清空未讀計(jì)數(shù)。

3.點(diǎn)擊種草社區(qū)盒子跳轉(zhuǎn)到用戶的種草社區(qū)消息頁。

所以對(duì)于種草社區(qū)盒子的未讀計(jì)數(shù)、最新文案、最新時(shí)間以及清空未讀計(jì)數(shù)、點(diǎn)擊種草社區(qū)盒子跳轉(zhuǎn)等操作,都要求不同于普通盒子的一套邏輯。

如果僅僅是種草社區(qū)盒子需要特殊處理,也就罷了,可惜還有售后進(jìn)度消息盒子。不僅僅如此,后面陸續(xù)增加了黑卡先生消息盒子和品牌動(dòng)態(tài)消息盒子,這兩個(gè)盒子的處理邏輯也都不相同。如黑卡先生消息盒子需求要求所有關(guān)注了黑卡先生賬號(hào)或者是正式會(huì)員的用戶才能看到黑卡先生盒子,每當(dāng)黑卡先生賬號(hào)有新文章發(fā)布或更新就通過未讀計(jì)數(shù)提示用戶……。

如此一來就有4個(gè)消息盒子需要特殊處理了,可以預(yù)見未來可能需要接入更多的,需特殊處理的消息盒子。

三.簡(jiǎn)單的實(shí)現(xiàn)方式

1.種草社區(qū)消息盒子簡(jiǎn)單的實(shí)現(xiàn)方式是通過mq消息設(shè)置最新文案,未讀計(jì)數(shù)等,即完全由種草社區(qū)發(fā)mq消息告訴消息中心盒子的數(shù)據(jù),消息中心只消費(fèi)mq消息。

2.售后進(jìn)度消息盒子則是開出兩個(gè)多帶帶的dubbo接口,用戶設(shè)置和讀取售后進(jìn)度盒子,這兩個(gè)dubbo接口只能用于售后消息盒子

// 設(shè)置售后進(jìn)度消息盒子

public boolean setAfterSaleMessageBoxContent(String accountId, Integer msgNum, String lastContent, Long lastTime, boolean oldReadStatus);    // 讀取售后進(jìn)度消息盒子
public boolean readAfterSaleMessageBox(String accountId);

這種實(shí)現(xiàn)方式的優(yōu)點(diǎn)是簡(jiǎn)單直接,再有特殊處理盒子只需要再開dubbo接口實(shí)現(xiàn)特殊邏輯即可。缺點(diǎn)是接口不通用,每次都需要開dubbo接口,可擴(kuò)展性差,部分操作NCR代碼重復(fù)編寫。

四.利用策略模式重構(gòu)消息盒子處理
在接黑卡先生和品牌動(dòng)態(tài)消息盒子需求時(shí),考慮到再開dubbo接口會(huì)讓代碼變得難以維護(hù),因此考慮采用策略模式將每個(gè)盒子的處理抽象成統(tǒng)一的行為。
先介紹策略模式,參考資料:https://blog.csdn.net/zuoxiao...:策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。
分析下定義,策略模式定義和封裝了一系列的算法,它們是可以相互替換的,也就是說它們具有共性,而它們的共性就體現(xiàn)在策略接口的行為上,另外為了達(dá)到最后一句話的目的,也就是說讓算法獨(dú)立于使用它的客戶而獨(dú)立變化,我們需要讓客戶端依賴于策略接口。

對(duì)比策略模式的定義,我們可以將所有消息盒子的處理抽象成一個(gè)策略接口,每個(gè)具體盒子的處理對(duì)應(yīng)一個(gè)具體的策略實(shí)現(xiàn)類。同時(shí)實(shí)現(xiàn)一個(gè)簡(jiǎn)單工廠方法,根據(jù)消息盒子類型選擇特定的策略類去處理這個(gè)盒子。

朝著這個(gè)方向思考,將盒子的處理抽象成如下一個(gè)MessageBoxHandler接口,該接口中有四個(gè)方法:

1.設(shè)置消息盒子的內(nèi)容(最新文案,未讀計(jì)數(shù),最新時(shí)間等)

2.獲取消息盒子的內(nèi)容

3.讀取清理消息盒子內(nèi)容

4.獲取消息盒子里的消息列表

/**

通用消息盒子處理接口。使用策略模式

/public interface MessageBoxHandler { /*

 * 設(shè)置對(duì)應(yīng)消息盒子的內(nèi)容,包括最新文案,最新時(shí)間,強(qiáng)弱消息數(shù),跳轉(zhuǎn)url
 */
public void setMessageBoxContent(KaolaAppMessage kaolaAppMessage, MessageBoxSetInfo messageBoxSetInfo, List accountIdList, int boxType, Boolean needUpdateNewMessageTime);    /**
 * 根據(jù)用戶賬號(hào)和盒子類型(或者是傳入的盒子緩存)得到盒子內(nèi)容(最新文案,最新時(shí)間,強(qiáng)弱消息數(shù))
 */
public KaolaAppMessageBox getMessageBoxContent(String accountId, int boxType, Map hintMap, boolean needMessage, boolean hasCalculate, Set filterMsgTypeSet);    /**
 * 清空消息盒子上的內(nèi)容
 */
public void clearMessageBoxContent(List accountIdList, int boxType);    /**
 * 根據(jù)賬號(hào)和盒子類型返回該盒子中消息列表
 */
public List getMessageList(String accountId, int boxType, Long indexMessageId, int limit, List filterMsgTypes);

}
有具體盒子處理策略實(shí)現(xiàn)類:

UML圖如下:

對(duì)照策略模式的UML圖,可以看出MessageBoxHandler對(duì)應(yīng)策略接口,抽象了消息盒子可以有的所有操作。MessageBoxHandlerWrapper是該接口的默認(rèn)空實(shí)現(xiàn),所有具體的盒子處理類只需要直接繼承該類,然后覆蓋需要的方法即可。對(duì)于消息盒子不需要的方法,則直接使用MessageBoxHandlerWrapper中的空實(shí)現(xiàn)(如種草社區(qū)盒子的getMessageList就是空實(shí)現(xiàn))。

MessageBoxHandlerFactory中簡(jiǎn)單工廠方法getMessageBoxHandler根據(jù)盒子類型獲取具體的盒子處理類:

public void init() {
    messageBoxhandlerArr = new MessageBoxHandler[11];
    messageBoxhandlerArr[0] = defaultMessageBoxHandler;
    messageBoxhandlerArr[1] = defaultMessageBoxHandler;
    messageBoxhandlerArr[2] = defaultMessageBoxHandler;
    messageBoxhandlerArr[3] = defaultMessageBoxHandler;
    messageBoxhandlerArr[4] = defaultMessageBoxHandler;
    messageBoxhandlerArr[5] = defaultMessageBoxHandler;
    messageBoxhandlerArr[6] = defaultMessageBoxHandler;
    messageBoxhandlerArr[7] = communityMessageBoxHandler;
    messageBoxhandlerArr[8] = afterSaleMessageBoxHandler;
    messageBoxhandlerArr[9] = blackCardMessageBoxHandler;
    messageBoxhandlerArr[10] = brandDynamicMessageBoxHandler;
}    public static MessageBoxHandler getMessageBoxHandler(int boxType) {        if (boxType < 0 || boxType >= messageBoxhandlerArr.length) {            return messageBoxhandlerArr[0];
    }        return messageBoxhandlerArr[boxType];
}

如此重構(gòu)之后在代碼中調(diào)用盒子處理類只需要如下調(diào)用

MessageBoxHandlerFactory.getMessageBoxHandler(boxType).getMessageList(accountId, boxType, indexMessageId, limit, filterMsgTypes);

重構(gòu)之后的優(yōu)點(diǎn):
1.所有消息盒子的處理有一個(gè)統(tǒng)一的抽象,對(duì)外dubbo接口更加通用。
2.dubbo接口實(shí)現(xiàn)變得簡(jiǎn)單,只需要根據(jù)盒子類型調(diào)用相關(guān)Handler的方法即可。
3.可擴(kuò)展性強(qiáng),此后再接入特殊處理的消息盒子,只需要增加對(duì)應(yīng)的Handler類,幾乎不需要修改新增dubbo接口。

更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問網(wǎng)易云社區(qū)。

文章來源: 網(wǎng)易云社區(qū)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25326.html

相關(guān)文章

  • 百度阿里網(wǎng)易大疆等大小廠前端校招面筋

    摘要:面過的公司,大疆,阿里,網(wǎng)易,百度,電信研發(fā)中心,深信服,華為,小米,搜狗,騰訊。拿了的公司目前是大疆電信深信服華為。一面二面因?yàn)闀r(shí)間太久,就直接放在一起了,問的都是基礎(chǔ)吧,講真,大疆前端面試不難,都是很基礎(chǔ)的,就是時(shí)間長(zhǎng),等的捉急。 自我介紹下:某985碩士,程序媛,接觸前端一年時(shí)間。從八月份開始校招面試筆試,前前后后大廠小廠也都面了挺多,不過大廠基本都被我掛完了,哭暈我,還是太菜啊...

    劉厚水 評(píng)論0 收藏0
  • 網(wǎng)易考拉規(guī)則引擎平臺(tái)架構(gòu)設(shè)計(jì)與實(shí)踐

    摘要:比如我們的指標(biāo)是最近分鐘的同一用戶的下單量,那么我們就需要實(shí)現(xiàn)一種類似的滑動(dòng)窗口算法,以便任何時(shí)候都能拿到最近分鐘的數(shù)據(jù)。 此文已由作者肖凡授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營(yíng)經(jīng)驗(yàn)。 背景考拉安全部技術(shù)這塊目前主要負(fù)責(zé)兩塊業(yè)務(wù):一個(gè)是內(nèi)審,主要是通過敏感日志管理平臺(tái)搜集考拉所有后臺(tái)系統(tǒng)的操作日志,數(shù)據(jù)導(dǎo)入到es后,結(jié)合storm進(jìn)行實(shí)時(shí)計(jì)算,主要有行為查詢...

    Berwin 評(píng)論0 收藏0
  • 校招社招必備核心前端面試問題與詳細(xì)解答

    摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問題的一些問題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線程,定時(shí)器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問題的一些問題并結(jié)合個(gè)...

    jonh_felix 評(píng)論0 收藏0
  • 校招社招必備核心前端面試問題與詳細(xì)解答

    摘要:本文總結(jié)了前端老司機(jī)經(jīng)常問題的一些問題并結(jié)合個(gè)人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識(shí)點(diǎn)。此外還有網(wǎng)絡(luò)線程,定時(shí)器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機(jī)制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機(jī)經(jīng)常問題的一些問題并結(jié)合個(gè)...

    Rango 評(píng)論0 收藏0
  • 聊聊 Apache Dubbo

    摘要:架構(gòu)中有兩個(gè)主要角色服務(wù)提供者和服務(wù)使用者。服務(wù)提供者在啟動(dòng)時(shí),向注冊(cè)中心注冊(cè)自己提供的服務(wù)。負(fù)載平衡旨在優(yōu)化資源使用,最大化吞吐量,最小化響應(yīng)時(shí)間,并避免任何單個(gè)資源的過載。 本文來自于我的個(gè)人主頁:Apache Dubbo,轉(zhuǎn)載請(qǐng)保留鏈接 ;) 在2011年10月27日,阿里巴巴開源了自己的SOA服務(wù)化治理方案的核心框架Dubbo,服務(wù)治理和SOA的設(shè)計(jì)理念開始逐漸在國(guó)內(nèi)軟件行業(yè)中...

    XFLY 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<