1. 程式人生 > >設計模式--中介者模式

設計模式--中介者模式

中介者模式(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