一模式定義
中介者模式,用一個中介對象來封裝一系列對象之間的交互,使各個對象中不需要顯示地引用其他對象實(shí)例,從而降低各個對象之間的耦合度,并且可以獨(dú)立地改變對象間的交互關(guā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中介者實(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>();
-
- /**
- * 注冊用戶信息
- *
- * @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);
- // 注冊到中介者對象中
- 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運(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("大家好,我叫張三!初來乍到,請多多關(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é)果
============================================================
張三 說:大家好,我叫張三!初來乍到,請多多關(guān)照!
User B Received Message : 大家好,我叫張三!初來乍到,請多多關(guān)照!
User C Received Message : 大家好,我叫張三!初來乍到,請多多關(guān)照!
============================================================
============================================================
李四 說:你好,我叫李四,歡迎加入!
User A Received Message : 你好,我叫李四,歡迎加入!
User C Received Message : 你好,我叫李四,歡迎加入!
============================================================
============================================================
王五 說:我是王五,歡迎歡迎!
User A Received Message : 我是王五,歡迎歡迎!
User B Received Message : 我是王五,歡迎歡迎!
============================================================
三該模式設(shè)計(jì)原則
1一對多的對象依賴轉(zhuǎn)化為一對一依賴
2集中控制提高類的復(fù)用性
四使用場合
(1)一組對象以定義良好但復(fù)雜的方式進(jìn)行通信,產(chǎn)生相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解。注意多個對象之間的相互依賴。
(2)想定制一個分布在多個類的行為,而不想生成太多的子類場合。
(3)產(chǎn)品架構(gòu)的研發(fā),更需要易于擴(kuò)展的場合。
五中介模式靜態(tài)類圖
|