摘要:一消息中心簡單介紹考拉的消息中心是負責(zé)發(fā)送和接受站內(nèi)信的服務(wù),比如營銷系統(tǒng)發(fā)送的活動消息,優(yōu)惠券到期消息等。考拉中的消息中心入口在首頁的右上角。不僅僅如此,后面陸續(xù)增加了黑卡先生消息盒子和品牌動態(tài)消息盒子,這兩個盒子的處理邏輯也都不相同。
本文由作者周敏敏授權(quán)網(wǎng)易云社區(qū)發(fā)布。
一.消息中心簡單介紹
考拉app的消息中心是負責(zé)發(fā)送和接受app站內(nèi)信的服務(wù),比如營銷系統(tǒng)發(fā)送的活動消息,優(yōu)惠券到期消息等。考拉app中的消息中心入口在首頁的右上角。點擊進去能夠看到消息盒子列表,點擊消息盒子能夠看到該盒子中的消息列表(有些盒子點擊是跳轉(zhuǎn)到特定URL)。
消息中心的功能簡單來說只有提供接口發(fā)送消息、用戶接收查看消息兩類。
發(fā)送消息可分為發(fā)送私信、組播、廣播
接受查看消息可分為:
1.發(fā)消息時,根據(jù)消息類型設(shè)置消息盒子的未讀計數(shù)(+1操作),最新文案,最新時間等
2.查詢返回消息盒子列表(正確返回每個盒子的未讀計數(shù),最新文案,最新時間)
3.點擊盒子,消除未讀消息數(shù)(當(dāng)前實現(xiàn)是只要點擊了盒子,就清空該盒子所有未讀消息數(shù)),返回盒子的消息列表(有些消息盒子是跳轉(zhuǎn)到特定url)
二.消息盒子越加越多,處理方式各不相同
剛接觸消息中心時,只有活動精選等6個消息盒子(處理邏輯相同,統(tǒng)稱為普通盒子),每個盒子的處理邏輯都一樣:
1.發(fā)消息時,增加盒子未讀計數(shù)、消息ID塞入盒子的消息ID列表中、設(shè)置盒子的最新文案和時間
2.點擊盒子,清空盒子的未讀計數(shù)
3.進入盒子,根據(jù)盒子的消息ID列表返回消息列表
如果一直是這樣,那將是很美好的,可惜……。在增加種草社區(qū)盒子的需求中,種草社區(qū)盒子的處理邏輯不同于普通盒子,大概要求:
1.種草社區(qū)盒子只作為查看種草消息的一個入口,消息體不存在消息中心,盒子上的未讀計數(shù)和文案由種草社區(qū)給出。
2.點擊種草社區(qū)盒子不清空未讀計數(shù)。
3.點擊種草社區(qū)盒子跳轉(zhuǎn)到用戶的種草社區(qū)消息頁。
所以對于種草社區(qū)盒子的未讀計數(shù)、最新文案、最新時間以及清空未讀計數(shù)、點擊種草社區(qū)盒子跳轉(zhuǎn)等操作,都要求不同于普通盒子的一套邏輯。
如果僅僅是種草社區(qū)盒子需要特殊處理,也就罷了,可惜還有售后進度消息盒子。不僅僅如此,后面陸續(xù)增加了黑卡先生消息盒子和品牌動態(tài)消息盒子,這兩個盒子的處理邏輯也都不相同。如黑卡先生消息盒子需求要求所有關(guān)注了黑卡先生賬號或者是正式會員的用戶才能看到黑卡先生盒子,每當(dāng)黑卡先生賬號有新文章發(fā)布或更新就通過未讀計數(shù)提示用戶……。
如此一來就有4個消息盒子需要特殊處理了,可以預(yù)見未來可能需要接入更多的,需特殊處理的消息盒子。
三.簡單的實現(xiàn)方式
1.種草社區(qū)消息盒子簡單的實現(xiàn)方式是通過mq消息設(shè)置最新文案,未讀計數(shù)等,即完全由種草社區(qū)發(fā)mq消息告訴消息中心盒子的數(shù)據(jù),消息中心只消費mq消息。
2.售后進度消息盒子則是開出兩個多帶帶的dubbo接口,用戶設(shè)置和讀取售后進度盒子,這兩個dubbo接口只能用于售后消息盒子
// 設(shè)置售后進度消息盒子
public boolean setAfterSaleMessageBoxContent(String accountId, Integer msgNum, String lastContent, Long lastTime, boolean oldReadStatus); // 讀取售后進度消息盒子 public boolean readAfterSaleMessageBox(String accountId);
這種實現(xiàn)方式的優(yōu)點是簡單直接,再有特殊處理盒子只需要再開dubbo接口實現(xiàn)特殊邏輯即可。缺點是接口不通用,每次都需要開dubbo接口,可擴展性差,部分操作NCR代碼重復(fù)編寫。
四.利用策略模式重構(gòu)消息盒子處理
在接黑卡先生和品牌動態(tài)消息盒子需求時,考慮到再開dubbo接口會讓代碼變得難以維護,因此考慮采用策略模式將每個盒子的處理抽象成統(tǒng)一的行為。
先介紹策略模式,參考資料:https://blog.csdn.net/zuoxiao...:策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
分析下定義,策略模式定義和封裝了一系列的算法,它們是可以相互替換的,也就是說它們具有共性,而它們的共性就體現(xiàn)在策略接口的行為上,另外為了達到最后一句話的目的,也就是說讓算法獨立于使用它的客戶而獨立變化,我們需要讓客戶端依賴于策略接口。
對比策略模式的定義,我們可以將所有消息盒子的處理抽象成一個策略接口,每個具體盒子的處理對應(yīng)一個具體的策略實現(xiàn)類。同時實現(xiàn)一個簡單工廠方法,根據(jù)消息盒子類型選擇特定的策略類去處理這個盒子。
朝著這個方向思考,將盒子的處理抽象成如下一個MessageBoxHandler接口,該接口中有四個方法:
1.設(shè)置消息盒子的內(nèi)容(最新文案,未讀計數(shù),最新時間等)
2.獲取消息盒子的內(nèi)容
3.讀取清理消息盒子內(nèi)容
4.獲取消息盒子里的消息列表
/**
通用消息盒子處理接口。使用策略模式
/public interface MessageBoxHandler { /*
* 設(shè)置對應(yīng)消息盒子的內(nèi)容,包括最新文案,最新時間,強弱消息數(shù),跳轉(zhuǎn)url */ public void setMessageBoxContent(KaolaAppMessage kaolaAppMessage, MessageBoxSetInfo messageBoxSetInfo, List accountIdList, int boxType, Boolean needUpdateNewMessageTime); /** * 根據(jù)用戶賬號和盒子類型(或者是傳入的盒子緩存)得到盒子內(nèi)容(最新文案,最新時間,強弱消息數(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ù)賬號和盒子類型返回該盒子中消息列表 */ public List getMessageList(String accountId, int boxType, Long indexMessageId, int limit, List filterMsgTypes);
}
有具體盒子處理策略實現(xiàn)類:
UML圖如下:
對照策略模式的UML圖,可以看出MessageBoxHandler對應(yīng)策略接口,抽象了消息盒子可以有的所有操作。MessageBoxHandlerWrapper是該接口的默認空實現(xiàn),所有具體的盒子處理類只需要直接繼承該類,然后覆蓋需要的方法即可。對于消息盒子不需要的方法,則直接使用MessageBoxHandlerWrapper中的空實現(xiàn)(如種草社區(qū)盒子的getMessageList就是空實現(xiàn))。
MessageBoxHandlerFactory中簡單工廠方法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)點:
1.所有消息盒子的處理有一個統(tǒng)一的抽象,對外dubbo接口更加通用。
2.dubbo接口實現(xiàn)變得簡單,只需要根據(jù)盒子類型調(diào)用相關(guān)Handler的方法即可。
3.可擴展性強,此后再接入特殊處理的消息盒子,只需要增加對應(yīng)的Handler類,幾乎不需要修改新增dubbo接口。
更多網(wǎng)易技術(shù)、產(chǎn)品、運營經(jīng)驗分享請訪問網(wǎng)易云社區(qū)。
文章來源: 網(wǎng)易云社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/25326.html
摘要:面過的公司,大疆,阿里,網(wǎng)易,百度,電信研發(fā)中心,深信服,華為,小米,搜狗,騰訊。拿了的公司目前是大疆電信深信服華為。一面二面因為時間太久,就直接放在一起了,問的都是基礎(chǔ)吧,講真,大疆前端面試不難,都是很基礎(chǔ)的,就是時間長,等的捉急。 自我介紹下:某985碩士,程序媛,接觸前端一年時間。從八月份開始校招面試筆試,前前后后大廠小廠也都面了挺多,不過大廠基本都被我掛完了,哭暈我,還是太菜啊...
摘要:比如我們的指標(biāo)是最近分鐘的同一用戶的下單量,那么我們就需要實現(xiàn)一種類似的滑動窗口算法,以便任何時候都能拿到最近分鐘的數(shù)據(jù)。 此文已由作者肖凡授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運營經(jīng)驗。 背景考拉安全部技術(shù)這塊目前主要負責(zé)兩塊業(yè)務(wù):一個是內(nèi)審,主要是通過敏感日志管理平臺搜集考拉所有后臺系統(tǒng)的操作日志,數(shù)據(jù)導(dǎo)入到es后,結(jié)合storm進行實時計算,主要有行為查詢...
摘要:本文總結(jié)了前端老司機經(jīng)常問題的一些問題并結(jié)合個人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識點。此外還有網(wǎng)絡(luò)線程,定時器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機經(jīng)常問題的一些問題并結(jié)合個...
摘要:本文總結(jié)了前端老司機經(jīng)常問題的一些問題并結(jié)合個人總結(jié)給出了比較詳盡的答案。網(wǎng)易阿里騰訊校招社招必備知識點。此外還有網(wǎng)絡(luò)線程,定時器任務(wù)線程,文件系統(tǒng)處理線程等等。線程核心是引擎。主線程和工作線程之間的通知機制叫做事件循環(huán)。 showImg(https://segmentfault.com/img/bVbu4aB?w=300&h=208); 本文總結(jié)了前端老司機經(jīng)常問題的一些問題并結(jié)合個...
摘要:架構(gòu)中有兩個主要角色服務(wù)提供者和服務(wù)使用者。服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。負載平衡旨在優(yōu)化資源使用,最大化吞吐量,最小化響應(yīng)時間,并避免任何單個資源的過載。 本文來自于我的個人主頁:Apache Dubbo,轉(zhuǎn)載請保留鏈接 ;) 在2011年10月27日,阿里巴巴開源了自己的SOA服務(wù)化治理方案的核心框架Dubbo,服務(wù)治理和SOA的設(shè)計理念開始逐漸在國內(nèi)軟件行業(yè)中...
閱讀 1840·2021-08-19 11:12
閱讀 1418·2021-07-25 21:37
閱讀 979·2019-08-30 14:07
閱讀 1259·2019-08-30 13:12
閱讀 644·2019-08-30 11:00
閱讀 3522·2019-08-29 16:28
閱讀 982·2019-08-29 15:33
閱讀 2959·2019-08-26 13:40