Java基于中介者模式實(shí)現(xiàn)多人聊天室功能示例
本文實(shí)例講述了Java基于中介者模式實(shí)現(xiàn)多人聊天室功能。分享給大家供大家參考,具體如下:
一 模式定義
中介者模式,用一個(gè)中介對(duì)象來封裝一系列對(duì)象之間的交互,使各個(gè)對(duì)象中不需要顯示地引用其他對(duì)象實(shí)例,從而降低各個(gè)對(duì)象之間的耦合度,并且可以獨(dú)立地改變對(duì)象間的交互關(guān)系。
二 模式舉例
1 模式分析
我們借用多人聊天室來說明這一模式

2 中介模式靜態(tài)類圖

3 代碼示例
3.1中介者接口——IMediator
package com.demo.mediator;
import com.demo.colleague.IUser;
/**
* 中介者接口
*
* @author
*
*/
public interface IMediator {
/**
* 注冊(cè)用戶信息
*
* @param user
*/
public void regist(IUser user);
/**
* 發(fā)送消息給所有人
*
* @param user
* 發(fā)送消息人
*/
public void notifyAllMessage(IUser user);
}
3.2 中介者實(shí)現(xiàn)——ConcreteMediator
package com.demo.mediator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.demo.colleague.IUser;
/**
* 中介者實(shí)現(xiàn)類
*
* @author
*
*/
public class ConcreteMediator implements IMediator {
private final List<IUser> list = new ArrayList<IUser>();
/**
* 注冊(cè)用戶信息
*
* @param user
*/
public void regist(IUser user) {
if (user != null && !list.contains(user)) {
list.add(user);
}
}
/**
* 發(fā)送消息
*
* @param user
* 發(fā)送消息人
*/
public void notifyAllMessage(IUser user) {
Iterator<IUser> iterator = list.iterator();
IUser tmpUser = null;
while (iterator.hasNext()) {
tmpUser = iterator.next();
if (tmpUser != null && !tmpUser.equals(user)) {
// 排除發(fā)送消息用戶
tmpUser.receiveMessage(user.getMessage());
}
}
}
}
3.3 用戶接口——IUser
package com.demo.colleague;
/**
* 用戶接口
*
* @author
*
*/
public interface IUser
{
/**
* 接收消息
*
* @param message
* 消息
*/
public void receiveMessage(String message);
/**
* 發(fā)送消息
*
* @param message
* 消息
*/
public void sendMessage(String message);
/**
* 獲得發(fā)送的消息內(nèi)容
*
* @return
*/
public String getMessage();
}
3.4 抽象用戶——AbstractUser
package com.demo.colleague;
import com.demo.mediator.IMediator;
/**
* 抽象用戶信息
*
* @author
*
*/
public abstract class AbstractUser implements IUser
{
// 中介者
protected IMediator mediator;
// 姓名
protected String name;
// 消息
protected String message;
public AbstractUser(IMediator mediator, String name)
{
this.mediator = mediator;
this.name = name;
}
/**
* 發(fā)送消息
*
* @param message
* 消息
*/
public void sendMessage(String message)
{
this.message = message;
System.out.println(this.name + " 說:" + this.message);
mediator.notifyAllMessage(this);
}
public String getMessage()
{
return message;
}
}
3.5 用戶A——UserA
package com.demo.colleague;
import com.demo.mediator.IMediator;
/**
* 用戶A
*
* @author
*
*/
public class UserA extends AbstractUser {
public UserA(IMediator mediator, String name) {
super(mediator, name);
// 注冊(cè)到中介者對(duì)象中
mediator.regist(this);
}
/**
* 接收消息方法
*/
public void receiveMessage(String message) {
System.out.println("User A Received Message : " + message);
}
}
3.6 用戶B——UserB
package com.demo.colleague;
import com.demo.mediator.IMediator;
/**
* 用戶B
*
* @author
*
*/
public class UserB extends AbstractUser {
public UserB(IMediator mediator, String name) {
super(mediator, name);
// 注冊(cè)到中介者對(duì)象中
mediator.regist(this);
}
/**
* 接收消息方法
*/
public void receiveMessage(String message) {
System.out.println("User B Received Message : " + message);
}
}
3.7 用戶C——UserC
package com.demo.colleague;
import com.demo.mediator.IMediator;
/**
* 用戶C
*
* @author
*
*/
public class UserC extends AbstractUser {
public UserC(IMediator mediator, String name) {
super(mediator, name);
// 注冊(cè)到中介者對(duì)象中
mediator.regist(this);
}
/**
* 接收消息方法
*/
public void receiveMessage(String message) {
System.out.println("User C Received Message : " + message);
}
}
3.8 運(yùn)行多人聊天室
package com.demo;
import com.demo.colleague.IUser;
import com.demo.colleague.UserA;
import com.demo.colleague.UserB;
import com.demo.colleague.UserC;
import com.demo.mediator.ConcreteMediator;
import com.demo.mediator.IMediator;
/**
*
* 主應(yīng)用程序
*
* @author
*
*/
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// 創(chuàng)建聊天室(中介者)
IMediator mediator = new ConcreteMediator();
// 創(chuàng)建用戶信息
IUser userA = new UserA(mediator, "張三");
IUser userB = new UserB(mediator, "李四");
IUser userC = new UserC(mediator, "王五");
System.out
.println("============================================================");
userA.sendMessage("大家好,我叫張三!初來乍到,請(qǐng)多多關(guān)照!");
System.out
.println("============================================================\n");
System.out
.println("============================================================");
userB.sendMessage("你好,我叫李四,歡迎加入!");
System.out
.println("============================================================\n");
System.out
.println("============================================================");
userC.sendMessage("我是王五,歡迎歡迎!");
System.out
.println("============================================================\n");
}
}
4 運(yùn)行結(jié)果
============================================================
張三 說:大家好,我叫張三!初來乍到,請(qǐng)多多關(guān)照!
User B Received Message : 大家好,我叫張三!初來乍到,請(qǐng)多多關(guān)照!
User C Received Message : 大家好,我叫張三!初來乍到,請(qǐng)多多關(guān)照!
============================================================
============================================================
李四 說:你好,我叫李四,歡迎加入!
User A Received Message : 你好,我叫李四,歡迎加入!
User C Received Message : 你好,我叫李四,歡迎加入!
============================================================
============================================================
王五 說:我是王五,歡迎歡迎!
User A Received Message : 我是王五,歡迎歡迎!
User B Received Message : 我是王五,歡迎歡迎!
============================================================
三 該模式設(shè)計(jì)原則
1 一對(duì)多的對(duì)象依賴轉(zhuǎn)化為一對(duì)一依賴
2 集中控制提高類的復(fù)用性
四 使用場(chǎng)合
(1)一組對(duì)象以定義良好但復(fù)雜的方式進(jìn)行通信,產(chǎn)生相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解。注意多個(gè)對(duì)象之間的相互依賴。
(2)想定制一個(gè)分布在多個(gè)類的行為,而不想生成太多的子類場(chǎng)合。
(3)產(chǎn)品架構(gòu)的研發(fā),更需要易于擴(kuò)展的場(chǎng)合。
五 中介模式靜態(tài)類圖

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
- java socket實(shí)現(xiàn)聊天室 java實(shí)現(xiàn)多人聊天功能
- 基于java編寫局域網(wǎng)多人聊天室
- java編程實(shí)現(xiàn)多人聊天室功能
- Java基于Tcp/ip連接的多人交互聊天室
- java使用MulticastSocket實(shí)現(xiàn)基于廣播的多人聊天室
- Java SE實(shí)現(xiàn)多人聊天室功能
- Java NIO Selector用法詳解【含多人聊天室實(shí)例】
- java實(shí)現(xiàn)多人聊天工具(socket+多線程)
- Java多線程實(shí)現(xiàn)多人聊天室功能
- java實(shí)現(xiàn)多人聊天系統(tǒng)
相關(guān)文章
SpringBoot中Redisson延遲隊(duì)列的示例
延時(shí)隊(duì)列是一種常見的需求,延時(shí)隊(duì)列允許我們延遲處理某些任務(wù),本文主要介紹了Redisson延遲隊(duì)列的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
mybatis-plus讀取JSON類型的方法實(shí)現(xiàn)
這篇文章主要介紹了mybatis-plus讀取JSON類型的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Spring Boot使用Servlet及Filter過程詳解
這篇文章主要介紹了Spring Boot使用Servlet及Filter過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
解析iReport自定義行數(shù)分頁(yè)的操作方法
ireport默認(rèn)都是自動(dòng)分頁(yè)數(shù)據(jù)超出頁(yè)面長(zhǎng)度就會(huì)自動(dòng)分到下一頁(yè),但有時(shí)候業(yè)務(wù)需要一頁(yè)只顯示固定幾行這時(shí)候就需要自定義條數(shù)了。下面看具體操作吧2021-10-10
IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn)
本文主要介紹了IDEA搭建Maven模塊化項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
一文教你如何將maven項(xiàng)目轉(zhuǎn)成web項(xiàng)目
在軟件開發(fā)過程中,有時(shí)我們需要將一個(gè)普通的Maven項(xiàng)目轉(zhuǎn)換為Web項(xiàng)目,以便能夠部署到Web容器中運(yùn)行,本文將詳細(xì)介紹如何通過簡(jiǎn)單的步驟完成這一轉(zhuǎn)換過程,希望對(duì)大家有所幫助2025-03-03
Java ThreadLocal的使用場(chǎng)景總結(jié)
ThreadLocal原本設(shè)計(jì)是為了解決并發(fā)時(shí),線程共享變量的問題,但由于過度設(shè)計(jì),從而導(dǎo)致它的理解難度大和使用成本高等問題。即便如此,ThreadLocal依舊有適合自己的使用場(chǎng)景,比如本文要介紹了這兩種使用場(chǎng)景,除了ThreadLocal之外,還真沒有合適的替代方案。2021-05-05

