[TOC] csdn連結:smilenicky.blog.csdn.net/article/det…
一、模式定義
中介者模式(Mediator Pattern):中介者模式就是用一箇中介物件來封裝一系列的物件的互動,使各物件之間不需要顯式地相互作用,降低物件之間的耦合度,中介者是一種物件行為型模式。
所以中介者模式適用於物件之間存在大量的關聯的情況,假如一個物件改變了,我們就需要跟蹤其關聯物件,做出對於調整,耦合度是很大的,所以就可以用中介者模式來降低耦合度。
二、模式角色
中介者模式包括如下角色:
- Mediator:抽象中介者
- ConcreteMediator:具體中介者
- Colleague:抽象同事類
- ConcreteColleague:具體同事類
三、模式分析
3.1 模式作用
中介者模式起到中轉的作用,當同事類需要呼叫時,呼叫中介者就好,不需要呼叫同事類,中介者模式將同事物件之間的關係行為進行封裝,起到了協調的作用
3.2 模式優缺點
中介者模式優點:
- 簡化了物件之間的互動
- 減少子類生成
- 解耦各同事類
- 簡化各同事類的設計和實現
中介者模式缺點:
- 由於物件之間的互動細節處理都放在中介者這裡,所以具體中介者類就會隨著物件的增多而變得越來越複雜,使中介者類維護起來很困難
3.3 模式經典程式碼
抽象中介者類:
public abstract class Mediator
{
protected ArrayList colleagues;
public void register(Colleague colleague)
{
colleagues.add(colleague);
}
public abstract void operation();
}
複製程式碼
具體中介者類:
public class ConcreteMediator extends Mediator
{
public void operation()
{
......
((Colleague)(colleagues.get(0))).method1();
......
}
}
複製程式碼
抽象同事類:
public abstract class Colleague
{
protected Mediator mediator;
public Colleague(Mediator mediator)
{
this.mediator=mediator;
}
public abstract void method1();
public abstract void method2();
}
複製程式碼
具體同事類:
public class ConcreteColleague extends Colleague
{
public ConcreteColleague(Mediator mediator)
{
super(mediator);
}
public void method1()
{
......
}
public void method2()
{
mediator.operation1();
}
}
複製程式碼
四、典型例子
例子來自:《設計模式》一書
例項:虛擬聊天室 某論壇系統欲增加一個虛擬聊天室,允許論壇會員通過該聊天室進行資訊交流,普通會員(CommonMember)可以給其他會員傳送文字資訊,鑽石會員(DiamondMember)既可以給其他會員傳送文字資訊,還可以傳送圖片資訊。該聊天室可以對不雅字元進行過濾,還可以對傳送的圖片大小進行控制。用中介者模式設計該虛擬聊天室。
抽象同事類 定義一個Member類,屬於抽象同事類:
public abstract class Member
{
protected AbstractChatroom chatroom;
protected String name;
public Member(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name=name;
}
public AbstractChatroom getChatroom()
{
return chatroom;
}
public void setChatroom(AbstractChatroom chatroom)
{
this.chatroom=chatroom;
}
public abstract void sendText(String to,String message);
public abstract void sendImage(String to,String image);
public void receiveText(String from,String message)
{
System.out.println(from + "傳送文字給" + this.name + ",內容為:" + message);
}
public void receiveImage(String from,String image)
{
System.out.println(from + "傳送圖片給" + this.name + ",內容為:" + image);
}
}
複製程式碼
具體同事類 具體同事類,繼承抽象同事類Member:
普通會員
public class CommonMember extends Member
{
public CommonMember(String name)
{
super(name);
}
public void sendText(String to,String message)
{
System.out.println("普通會員傳送資訊:");
chatroom.sendText(name,to,message); //傳送
}
public void sendImage(String to,String image)
{
System.out.println("普通會員不能傳送圖片!");
}
}
複製程式碼
磚石會員
public class DiamondMember extends Member
{
public DiamondMember(String name)
{
super(name);
}
public void sendText(String to,String message)
{
System.out.println("鑽石會員傳送資訊:");
chatroom.sendText(name,to,message); //傳送
}
public void sendImage(String to,String image)
{
System.out.println("鑽石會員傳送圖片:");
chatroom.sendImage(name,to,image); //傳送
}
}
複製程式碼
抽象中介者類
抽象的中介者類,定義聊天室具體有功能方法
public abstract class AbstractChatroom
{
public abstract void register(Member member);
public abstract void sendText(String from,String to,String message);
public abstract void sendImage(String from,String to,String message);
}
複製程式碼
具體中介者類
聊天室功能實現,不需要同事類之間相互呼叫
import java.util.*;
public class ChatGroup extends AbstractChatroom
{
private Hashtable members=new Hashtable();
public void register(Member member)
{
if(!members.contains(member))
{
members.put(member.getName(),member);
member.setChatroom(this);
}
}
public void sendText(String from,String to,String message)
{
Member member=(Member)members.get(to);
String newMessage=message;
newMessage=message.replaceAll("不雅字元","*");
member.receiveText(from,newMessage);
}
public void sendImage(String from,String to,String image)
{
Member member=(Member)members.get(to);
//模擬圖片大小判斷
if(image.length()>5)
{
System.out.println("圖片太大,傳送失敗!");
}
else
{
member.receiveImage(from,image);
}
}
}
複製程式碼
五、模式應用
- 中介者模式是事件驅動類軟體中應用比較多,中介者模式充當元件之間呼叫的中介,對元件呼叫進行協調
- MVC是JavaEE的一個基本模式,此時控制器Controller作為一箇中介者,負責檢視物件View和模型物件Model之間的互動,