亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即時聊天系統:9.觀察者模式

2019-11-15 00:10:15
字體:
來源:轉載
供稿:網友
【迷你微信】基于MINA、Hibernate、SPRing、Protobuf的即時聊天系統:9.觀察者模式

項目Logo歡迎閱讀我的開源項目《迷你微信》服務器與《迷你微信》客戶端

前言

在一個程序的迭代過程中,復雜度漸漸上升,可能會出現一些跨模塊的調用的需求,若是直接得到引用來進行使用,會導致模塊間的耦合度越來越高,消息機制是一種用于解耦這種耦合度高模塊的好方法,它的使用非常靈活便利,可以解決一對多(一個發送者,多個接受者)和需求頻繁的變更,甚至于,在添加新的需求時可以完全的不改動舊的代碼。在java中消息機制可以用觀察者模式來實現。

前緣未了

在【迷你微信】基于MINA、Hibernatye、Spring、Protobuf的即時聊天系統:7.項目介紹之架構中,我們說道了在發送聊天消息時,可能出現接受者不在線的情況,因為可能出現的各種復雜情況,封裝到我們將發送消息這個行為ServerModel_Chatting類中。

不知道大家有沒有注意到,微信的聊天消息是可能發送失敗的,也許因為網絡問題,也許因為對方根本沒有開啟微信,若是像登陸、注冊等請求,服務器向客戶端發包失敗,想偷懶的話,是可以不作處理的,不僅因為這種事件發生的幾率較少,也是因為這種異常的拋棄不會造成不可接受的后果,大不了再點擊一次登陸咯。但是,請想象一下,若是您的好友給您發了一條消息,因為您的一時網絡問題,服務器不能成功的發送給您,就將其直接拋棄,那么……您可能被您的友人認為是無視了他的消息,這種后果是不可接受的

所以,我們要對發送失敗的消息進行存儲,并在對方上線后及時的推送過去,這個模塊是比較復雜的,而且牽扯到復用(單聊、群聊)問題,還有存儲為永久數據問題,所以我們將其獨立成單獨的一個類來處理。在ServerModel_Chatting類的sendChatting方法中我們首先要從ServerModel中查找接受者是否在線,在線則可以直接推送;而不在線的情況下,則需要暫時存儲下來,等待接受者上線。

// 發送一條聊天消息public void sendChatting(final Chatting chattings) {ClientUser clientUser = serverModel.getClientUserByUserId(chattings.getReceiverUserId());// 如果不在線,則暫存if (clientUser == null){addChatting(chattings);return;}// 發送}// 暫存一條消息public void addChatting(Chatting chatting) {// 保存消息}

可以看到,發送聊天消息這個過程中,首先會判斷接受者是否在線,若是不在線會將消息暫存,在接受者上線后將接收到服務器推送的消息。然而,這個模塊如何知道接受者上線了呢?我們通過觀察者模式,在用戶登陸時通知本模塊進行查詢是否有為接收消息。

觀察者模式

觀察者模式中,首先要有被觀察者和觀察者兩個角色(可以有多個觀察者,俗稱”圍觀“(⊙o⊙)…),被觀察者要繼承Observable類,觀察者要對被觀察者對象調用addObserver 方法。

此處代碼皆為刪減版,欲查看完整代碼,請參考開源項目《迷你微信》服務器

先說說我們如何在用戶登陸時通知消息發送模塊進行查驗。1.在Server_User的 login方法中,用戶登陸成功時,會調用ServerModel的 clientUserLogin 方法,

public void clientUserLogin(ClientUser clientUser, String userId) {// 保存用戶信息clientUser.onLine = true;clientUser.userId = userId;clientUserIdTable.put(userId, clientUser);// 通知變更setChange();notifyObservers(new ObserverMessage_Login(clientUser.iosession, userId));}

在上面的方法中,我們將自己設置為變更狀態,然后通知所有觀察者。

2.觀察者ServerModel_Chatting添加監聽并進行處理

serverModel.addObserver(new Observer() {@Overridepublic void update(Observable o, Object arg) {ObserverMessage om = (ObserverMessage) arg;if (om.type == ObserverMessage.Type.Login) {// 發送登陸者未接收的消息}}}

在這里,我們對serverModel的實例化對象添加了一個監聽,判斷是否為監聽事件,若是,則發送未接收的消息。

后話

其實在本項目中,使用觀察者模式并不是一個好的做法,理由如下:

  • 被監聽者需要繼承Observable基類,在Java這種單繼承的語言中,這是不友好的。
  • 觀察者觀察到的消息需要每次都進行類型的判斷,針對性較差。
  • 觀察者需要得到被觀察者的引用才能添加觀察,耦合度沒有太大的減小。

因為帖主的這個項目中,目前只有這一個點需要用到這樣一種功能,所以偷了個懶。一旦需求復雜度提升,我們需要將觀察者模式做一些變化,將其做成完整的消息機制,使其具備一下幾個特點:

  • 消息發送者不需要繼承基類
  • 可以根據需要編寫不同的消息,接收者只需要注冊監聽指定的消息類型就可以接收到消息特定消息,而不是所有消息都接收。
  • 消息接收者不需要使用發送者的引用。

帖主的想法如下:

  • 首先,由使用者編寫各種消息MessageA, MessageB。
  • 有一個消息管理器MessageManager,其中擁有一個Hashtable>的哈希表對象,第一個參數是消息的類名(如MessageA),第二個鏈表參數是注冊監聽的所有監聽者。
  • 監聽者實現監聽接口,并將自己的引用和要注冊監聽的消息類型傳入MessageManager進行監聽。
  • 當消息被發送到MessageManager時,MessageManager會從Hashtable中取出注冊監聽的監聽者隊列,依次發送消息。

歡迎閱讀我的開源項目《迷你微信》服務器與《迷你微信》客戶端


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品尤物福利片在线观看| 久久成年人免费电影| 成人欧美一区二区三区黑人孕妇| 91国产美女视频| 色悠悠久久久久| 精品免费在线观看| 久久免费视频这里只有精品| 国产97免费视| 亲爱的老师9免费观看全集电视剧| 久久视频在线观看免费| 国产丝袜一区二区三区免费视频| 91欧美精品午夜性色福利在线| 日本亚洲欧美三级| 国产午夜精品视频免费不卡69堂| 一区二区三区四区精品| 精品久久国产精品| 中文字幕av一区中文字幕天堂| 美女国内精品自产拍在线播放| 亚洲欧美日韩国产中文专区| 国产不卡精品视男人的天堂| 日韩精品有码在线观看| 日韩经典第一页| 久久精品国产成人| 一区二区日韩精品| 九九九热精品免费视频观看网站| 秋霞av国产精品一区| 91久久久久久久久久久久久| 成人黄色免费在线观看| 日韩免费精品视频| 久久久久中文字幕2018| 久久全球大尺度高清视频| 亚洲免费av片| 久久精品国产亚洲一区二区| 2020国产精品视频| 亚洲精品电影久久久| 久久久国产在线视频| 2021国产精品视频| 欧美性猛交xxxx偷拍洗澡| 精品久久久国产| 亚洲精品中文字幕女同| www.xxxx精品| 欧美在线视频播放| 亚洲一区二区久久久久久| 久热精品视频在线观看| 日韩欧美在线国产| 亚洲性视频网站| 欧美美女操人视频| 成人免费大片黄在线播放| 亚洲欧美日韩在线高清直播| 日韩国产在线播放| 欧美电影在线免费观看网站| 欧美一区二区三区精品电影| 中文字幕精品影院| 久久噜噜噜精品国产亚洲综合| 欧美性在线视频| 国产丝袜一区视频在线观看| 亚洲天堂第一页| 曰本色欧美视频在线| 久久国产精品网站| 久久国产精品久久久久久| 91久久国产精品| 亚洲成人精品久久久| 欧美高清性猛交| 国产精品极品美女在线观看免费| 午夜精品久久久久久久久久久久| 久久中文精品视频| 一区二区三区国产在线观看| 久久精品视频亚洲| 欧美xxxx综合视频| 欧美猛交ⅹxxx乱大交视频| 欧美一级免费视频| 亚洲福利视频二区| 日本伊人精品一区二区三区介绍| 国产精品毛片a∨一区二区三区|国| 久久久国产精品亚洲一区| 久久影视电视剧免费网站清宫辞电视| 日韩av电影在线免费播放| 国产精品盗摄久久久| 国产精品一区二区三区久久久| 欧美三级欧美成人高清www| 国产97在线播放| 日韩专区中文字幕| 日韩av网址在线观看| 国产丝袜一区二区| 亚洲欧美第一页| 国产成人在线一区| 日韩不卡在线观看| 国产精品免费一区二区三区都可以| 日韩在线视频中文字幕| 国产成人在线视频| 日韩欧美在线免费| 91国产高清在线| 国产精品第10页| 欧美国产日韩一区二区| 成人午夜一级二级三级| xvideos亚洲人网站| 免费91麻豆精品国产自产在线观看| 成人国产精品久久久| 国产日韩专区在线| 亚洲第一中文字幕| 亚洲视频电影图片偷拍一区| 亚洲人成电影网站| 亚洲成人精品av| 亚洲女人天堂成人av在线| 色婷婷**av毛片一区| 国产精品极品尤物在线观看| 国产成人高清激情视频在线观看| 日韩精品在线观| 亚洲精品第一国产综合精品| 美日韩丰满少妇在线观看| 国内精品久久久久影院优| 日韩成人在线网站| 91成人在线观看国产| 国产亚洲视频在线| 国产91网红主播在线观看| 久久视频国产精品免费视频在线| 亚洲欧美国产另类| 亚洲大胆人体av| 欧美巨乳在线观看| 久热精品视频在线免费观看| 国产精品久久久久999| 日韩有码在线视频| 亚洲色图国产精品| 国产精品成人av在线| 国产精品最新在线观看| 国内精品久久久久久中文字幕| 中文字幕v亚洲ⅴv天堂| 国产丝袜精品第一页| 日韩免费观看在线观看| 成人写真福利网| 久久久天堂国产精品女人| 亚洲国产精品人久久电影| 精品日本美女福利在线观看| 中文字幕精品网| 另类少妇人与禽zozz0性伦| 欧美精品18videosex性欧美| 久久久久久国产精品久久| 亚洲欧美国产精品| 日韩精品久久久久久福利| 久久久噜噜噜久久中文字免| 中文字幕久热精品在线视频| 国产精品久久久久久久久久新婚| 日韩精品久久久久| 欧美精品激情视频| 欧美美女15p| 亚洲国产免费av| 欧美精品电影在线| 一区二区三区无码高清视频| 中文字幕欧美视频在线| 成人网在线视频| 日韩av影院在线观看| 国产精品久久久久久久天堂| 日韩欧美成人免费视频| 欧美成人免费观看| 久久久中精品2020中文| 97在线视频国产| www.99久久热国产日韩欧美.com| 欧美黑人巨大xxx极品| 久久精品99久久香蕉国产色戒| 国产精品三级久久久久久电影| 国产精品久久久久久久久借妻| 国产精品ⅴa在线观看h| 亚洲成人在线网| 2019中文在线观看|