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

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 + " 說(shuō):" + 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("大家好,我叫張三!初來(lái)乍到,請(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é)果
============================================================
張三 說(shuō):大家好,我叫張三!初來(lái)乍到,請(qǐng)多多關(guān)照!
User B Received Message : 大家好,我叫張三!初來(lái)乍到,請(qǐng)多多關(guān)照!
User C Received Message : 大家好,我叫張三!初來(lái)乍到,請(qǐng)多多關(guān)照!
============================================================
============================================================
李四 說(shuō):你好,我叫李四,歡迎加入!
User A Received Message : 你好,我叫李四,歡迎加入!
User C Received Message : 你好,我叫李四,歡迎加入!
============================================================
============================================================
王五 說(shuō):我是王五,歡迎歡迎!
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)文章
Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能
這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程TCP實(shí)現(xiàn)聊天功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Java實(shí)現(xiàn)兩人五子棋游戲(三) 畫出棋子
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)兩人五子棋游戲,畫出五子棋的棋子,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
Spring Security實(shí)現(xiàn)驗(yàn)證碼登錄功能
這篇文章主要介紹了Spring Security實(shí)現(xiàn)驗(yàn)證碼登錄功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
SpringBoot整合ShardingSphere5.x實(shí)現(xiàn)數(shù)據(jù)加解密功能(最新推薦)
這篇文章主要介紹了SpringBoot整合ShardingSphere5.x實(shí)現(xiàn)數(shù)據(jù)加解密功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
詳解Spring Boot Web項(xiàng)目之參數(shù)綁定
本篇文章主要介紹了詳解Spring Boot Web項(xiàng)目之參數(shù)綁定,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
如何開啟控制臺(tái)輸出mybatis執(zhí)行的sql日志問(wèn)題
這篇文章主要介紹了如何開啟控制臺(tái)輸出mybatis執(zhí)行的sql日志問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
解決Request.getParameter獲取不到特殊字符bug問(wèn)題
這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

