設計模式--中介者模式
阿新 • • 發佈:2018-12-30
中介者模式(Mediator Pattern)
中介者模式是用來降低多個物件和類之間的通訊複雜性。這種模式提供了一箇中介類,該類通常處理不同類之間的通訊,並支援鬆耦合,使程式碼易於維護。中介者模式屬於行為型模式。
介紹
意圖:用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
角色劃分:
1. 抽象中介者角色:抽象中介者角色定義了統一的介面與各個同事角色之間進行通訊。
2. 具體中介者角色:具體中介者角色實現了抽象中介者介面,具體協調各個同事類之間的協作。
3. 抽象同事角色:定義與中介者之間溝通的介面。
4. 具體同事角色:實現抽象同事角色介面,具體處理與中介者的通訊行為。
應用場景
1. 一組物件以定義良好但是複雜的方式進行通訊,產生的相互依賴關係結構混亂且難以理解。注意是多個物件之間相互依賴。
2. 想定製一個分佈在多個類中的行為,而不想生成太多的子類的場合。
3. 產品架構的研發,更需要易於擴充套件的場合。
優點:
1. 降低了類的複雜度,將一對多轉化成了一對一。
2. 各個類之間的解耦。
3. 符合迪米特原則。
缺點:中介者會龐大,變得複雜難以維護。
注意事項:不應當在職責混亂的時候使用。
實現
本例我們使用一個多人聊天室的模擬場景。有很多個User,每個User即可以傳送訊息,也可以收到其他User傳送訊息。
步驟 1
建立抽象物件介面,包括中介者介面和User介面。
中介者介面
IMediator.java
package com.mrcsj.test.study.mediator; /** * 中介者介面 * @author admin * @version 1.0 * @created 17-十一月-2016 10:53:07 */ public interface IMediator { /** * * @param user */ public void notifyAllMessage(IUser user); /** * * @param user */ public void register(IUser user); }
User介面
IUser.java
package com.mrcsj.test.study.mediator;
/**
* 使用者介面
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:08
*/
public interface IUser {
/**
* 獲取訊息
*/
public String getMessage();
/**
* 接收訊息
*
* @param message
*/
public void receiveMessage(String message);
/**
*
* @param message
*/
public void sendMessage(String message);
}
步驟 2
建立中介者實現類,抽象使用者類以及IUser的實現類。
ConcreteMediator.java
package com.mrcsj.test.study.mediator;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:05
*/
public class ConcreteMediator implements IMediator {
private final ArrayList<IUser> list = new ArrayList<IUser>();
public ConcreteMediator(){
}
public void finalize() throws Throwable {
}
/**
*
* @param user
*/
public void notifyAllMessage(IUser user){
Iterator<IUser> iterator = list.iterator();
IUser tmp = null;
while(iterator.hasNext()) {
tmp = iterator.next();
if(tmp != null && tmp!= user) {
tmp.receiveMessage(user.getMessage());
}
}
}
/**
*
* @param user
*/
public void register(IUser user){
if(user != null && !list.contains(user)) {
list.add(user);
}
}
}//end ConcreteMediator
抽象使用者類,AbstractUser.java
package com.mrcsj.test.study.mediator;
/**
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:01
*/
public abstract class AbstractUser implements IUser {
private IMediator mediator;
private String message;
private String name;
public AbstractUser(){
}
/**
*
* @param mediator
* @param name
*/
public AbstractUser(IMediator mediator, String name){
this.mediator = mediator;
this.name = name;
}
public String getMessage(){
return message;
}
/**
*
* @param message
*/
public void sendMessage(String message){
this.message = message;
System.out.println(this.name + " speak : " + message);
mediator.notifyAllMessage(this);
}
/**
* 接收訊息
*
* @param message
*/
public void receiveMessage(String message){
}
}//end AbstractUser
IUser介面的實現。
UserA.java
package com.mrcsj.test.study.mediator;
/**
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:09
*/
public class UserA extends AbstractUser {
public UserA(){
}
public void finalize() throws Throwable {
}
/**
*
* @param mediator
* @param name
*/
public UserA(IMediator mediator, String name){
super(mediator, name);
mediator.register(this);
}
/**
*
* @param message
*/
public void receiveMessage(String message){
System.out.println("A received : " + message);
}
}//end UserA
UserB.java
package com.mrcsj.test.study.mediator;
/**
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:10
*/
public class UserB extends AbstractUser {
public UserB(){
}
public void finalize() throws Throwable {
}
/**
*
* @param mediator
* @param name
*/
public UserB(IMediator mediator, String name){
super(mediator, name);
mediator.register(this);
}
/**
*
* @param message
*/
public void receiveMessage(String message){
System.out.println("B received : " + message);
}
}//end UserB
UserC.java
package com.mrcsj.test.study.mediator;
/**
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:12
*/
public class UserC extends AbstractUser {
public UserC(){
}
public void finalize() throws Throwable {
}
/**
*
* @param mediator
* @param name
*/
public UserC(IMediator mediator, String name){
super(mediator, name);
mediator.register(this);
}
/**
*
* @param message
*/
public void receiveMessage(String message){
System.out.println("C received : " + message);
}
}//end UserC
步驟 3
建立客戶端,進行測試。
Client.java
package com.mrcsj.test.study.mediator;
/**
* 客戶端
* @author admin
* @version 1.0
* @created 17-十一月-2016 10:53:04
*/
public class Client {
public static void main(String[] args) {
IMediator mediator = new ConcreteMediator();
IUser a = new UserA(mediator, "A");
IUser b = new UserB(mediator, "B");
IUser c = new UserC(mediator, "C");
a.sendMessage("hello friend");
b.sendMessage("yeah");
c.sendMessage("hh");
}
}//end Client
步驟 4
驗證輸出。
A speak : hello friend
B received : hello friend
C received : hello friend
B speak : yeah
A received : yeah
C received : yeah
C speak : hh
A received : hh
B received : hh