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

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

3 代碼示例
3.1中介者接口——IMediator
package com.demo.mediator;
import com.demo.colleague.IUser;
/**
* 中介者接口
*
* @author
*
*/
public interface IMediator {
/**
* 注冊用戶信息
*
* @param user
*/
public void regist(IUser user);
/**
* 發(fā)送消息給所有人
*
* @param user
* 發(fā)送消息人
*/
public void notifyAllMessage(IUser user);
}
3.2 中介者實現(xiàn)——ConcreteMediator
package com.demo.mediator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.demo.colleague.IUser;
/**
* 中介者實現(xiàn)類
*
* @author
*
*/
public class ConcreteMediator implements IMediator {
private final List<IUser> list = new ArrayList<IUser>();
/**
* 注冊用戶信息
*
* @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ā)送的消息內容
*
* @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);
// 注冊到中介者對象中
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);
// 注冊到中介者對象中
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);
// 注冊到中介者對象中
mediator.regist(this);
}
/**
* 接收消息方法
*/
public void receiveMessage(String message) {
System.out.println("User C Received Message : " + message);
}
}
3.8 運行多人聊天室
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;
/**
*
* 主應用程序
*
* @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("大家好,我叫張三!初來乍到,請多多關照!");
System.out
.println("============================================================\n");
System.out
.println("============================================================");
userB.sendMessage("你好,我叫李四,歡迎加入!");
System.out
.println("============================================================\n");
System.out
.println("============================================================");
userC.sendMessage("我是王五,歡迎歡迎!");
System.out
.println("============================================================\n");
}
}
4 運行結果
============================================================
張三 說:大家好,我叫張三!初來乍到,請多多關照!
User B Received Message : 大家好,我叫張三!初來乍到,請多多關照!
User C Received Message : 大家好,我叫張三!初來乍到,請多多關照!
============================================================
============================================================
李四 說:你好,我叫李四,歡迎加入!
User A Received Message : 你好,我叫李四,歡迎加入!
User C Received Message : 你好,我叫李四,歡迎加入!
============================================================
============================================================
王五 說:我是王五,歡迎歡迎!
User A Received Message : 我是王五,歡迎歡迎!
User B Received Message : 我是王五,歡迎歡迎!
============================================================
三 該模式設計原則
1 一對多的對象依賴轉化為一對一依賴
2 集中控制提高類的復用性
四 使用場合
(1)一組對象以定義良好但復雜的方式進行通信,產生相互依賴關系結構混亂且難以理解。注意多個對象之間的相互依賴。
(2)想定制一個分布在多個類的行為,而不想生成太多的子類場合。
(3)產品架構的研發(fā),更需要易于擴展的場合。
五 中介模式靜態(tài)類圖

更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數(shù)據(jù)結構與算法教程》、《Java操作DOM節(jié)點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。
相關文章
Spring Security實現(xiàn)驗證碼登錄功能
這篇文章主要介紹了Spring Security實現(xiàn)驗證碼登錄功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-01-01
SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能(最新推薦)
這篇文章主要介紹了SpringBoot整合ShardingSphere5.x實現(xiàn)數(shù)據(jù)加解密功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
如何開啟控制臺輸出mybatis執(zhí)行的sql日志問題
這篇文章主要介紹了如何開啟控制臺輸出mybatis執(zhí)行的sql日志問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09
解決Request.getParameter獲取不到特殊字符bug問題
這篇文章主要介紹了解決Request.getParameter獲取不到特殊字符bug問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07

