国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

ssshooter / 1173人閱讀

摘要:一消息中心簡單介紹考拉的消息中心是負責發送和接受站內信的服務,比如營銷系統發送的活動消息,優惠券到期消息等。考拉中的消息中心入口在首頁的右上角。不僅僅如此,后面陸續增加了黑卡先生消息盒子和品牌動態消息盒子,這兩個盒子的處理邏輯也都不相同。

本文由作者周敏敏授權網易云社區發布。

一.消息中心簡單介紹

考拉app的消息中心是負責發送和接受app站內信的服務,比如營銷系統發送的活動消息,優惠券到期消息等。考拉app中的消息中心入口在首頁的右上角。點擊進去能夠看到消息盒子列表,點擊消息盒子能夠看到該盒子中的消息列表(有些盒子點擊是跳轉到特定URL)。

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

發送消息可分為發送私信、組播、廣播

接受查看消息可分為:

1.發消息時,根據消息類型設置消息盒子的未讀計數(+1操作),最新文案,最新時間等

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

3.點擊盒子,消除未讀消息數(當前實現是只要點擊了盒子,就清空該盒子所有未讀消息數),返回盒子的消息列表(有些消息盒子是跳轉到特定url)

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

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

1.發消息時,增加盒子未讀計數、消息ID塞入盒子的消息ID列表中、設置盒子的最新文案和時間

2.點擊盒子,清空盒子的未讀計數

3.進入盒子,根據盒子的消息ID列表返回消息列表

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

1.種草社區盒子只作為查看種草消息的一個入口,消息體不存在消息中心,盒子上的未讀計數和文案由種草社區給出。

2.點擊種草社區盒子不清空未讀計數。

3.點擊種草社區盒子跳轉到用戶的種草社區消息頁。

所以對于種草社區盒子的未讀計數、最新文案、最新時間以及清空未讀計數、點擊種草社區盒子跳轉等操作,都要求不同于普通盒子的一套邏輯。

如果僅僅是種草社區盒子需要特殊處理,也就罷了,可惜還有售后進度消息盒子。不僅僅如此,后面陸續增加了黑卡先生消息盒子和品牌動態消息盒子,這兩個盒子的處理邏輯也都不相同。如黑卡先生消息盒子需求要求所有關注了黑卡先生賬號或者是正式會員的用戶才能看到黑卡先生盒子,每當黑卡先生賬號有新文章發布或更新就通過未讀計數提示用戶……。

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

三.簡單的實現方式

1.種草社區消息盒子簡單的實現方式是通過mq消息設置最新文案,未讀計數等,即完全由種草社區發mq消息告訴消息中心盒子的數據,消息中心只消費mq消息。

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

// 設置售后進度消息盒子

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

這種實現方式的優點是簡單直接,再有特殊處理盒子只需要再開dubbo接口實現特殊邏輯即可。缺點是接口不通用,每次都需要開dubbo接口,可擴展性差,部分操作NCR代碼重復編寫。

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

對比策略模式的定義,我們可以將所有消息盒子的處理抽象成一個策略接口,每個具體盒子的處理對應一個具體的策略實現類。同時實現一個簡單工廠方法,根據消息盒子類型選擇特定的策略類去處理這個盒子。

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

1.設置消息盒子的內容(最新文案,未讀計數,最新時間等)

2.獲取消息盒子的內容

3.讀取清理消息盒子內容

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

/**

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

/public interface MessageBoxHandler { /*

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

}
有具體盒子處理策略實現類:

UML圖如下:

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

MessageBoxHandlerFactory中簡單工廠方法getMessageBoxHandler根據盒子類型獲取具體的盒子處理類:

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];
}

如此重構之后在代碼中調用盒子處理類只需要如下調用

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

重構之后的優點:
1.所有消息盒子的處理有一個統一的抽象,對外dubbo接口更加通用。
2.dubbo接口實現變得簡單,只需要根據盒子類型調用相關Handler的方法即可。
3.可擴展性強,此后再接入特殊處理的消息盒子,只需要增加對應的Handler類,幾乎不需要修改新增dubbo接口。

更多網易技術、產品、運營經驗分享請訪問網易云社區。

文章來源: 網易云社區

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25326.html

相關文章

  • 百度阿里網易大疆等大小廠前端校招面筋

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

    劉厚水 評論0 收藏0
  • 網易考拉規則引擎平臺架構設計與實踐

    摘要:比如我們的指標是最近分鐘的同一用戶的下單量,那么我們就需要實現一種類似的滑動窗口算法,以便任何時候都能拿到最近分鐘的數據。 此文已由作者肖凡授權網易云社區發布。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 背景考拉安全部技術這塊目前主要負責兩塊業務:一個是內審,主要是通過敏感日志管理平臺搜集考拉所有后臺系統的操作日志,數據導入到es后,結合storm進行實時計算,主要有行為查詢...

    Berwin 評論0 收藏0
  • 校招社招必備核心前端面試問題與詳細解答

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

    jonh_felix 評論0 收藏0
  • 校招社招必備核心前端面試問題與詳細解答

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

    Rango 評論0 收藏0
  • 聊聊 Apache Dubbo

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

    XFLY 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<