天天看點

Java中介者模式(Mediator)

中介者模式(Mediator)

Java中介者模式(Mediator)

場景(中介大家熟悉嗎?房産中介?):

   假如沒有總經理。下面三個部門:财務部、市場部、研發部。财務部要發工資,讓大家核對公司需要跟市場部和研發部都通氣;市場部要接個新項目,需要研發部處理技術、需要财務部出資金。市場部跟各個部門打交道。 雖然隻有三個部門,但是關系非常亂。

Java中介者模式(Mediator)
   實際上,公司都有總經理。各個部門有什麼事情都通報到總經理這裡,總經理再通知各個相關部門。
Java中介者模式(Mediator)

   這就是一個典型的“中介者模式”,總經理起到一個中介、協調的作用

實作核心

 如果一個系統中對象之間的聯系呈現為網狀結構,對象之間存在大量多對多關系,将導緻關系及其複雜,這些對象稱為"同僚對象",我們可以引入一個中介者對象,使各個同僚對象隻跟中介者對象打交道,将複雜的網絡結構化解為星型結構。

Java中介者模式(Mediator)
案例類圖
Java中介者模式(Mediator)

案例實作

定義中介者

/**
 * 中介者接口
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public interface Mediator {
    
    /**
     * 注冊 同僚
     * @param dname
     * @param d
     */
    void register(String dname,Department d);
    
    /**
     * 執行 處理
     * @param dname
     */
    void command(String dname);
}      

建立中介者實作

/**
 * 中介者的實作類
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public class President implements Mediator {
    
    private Map<String,Department> map = new HashMap<String , Department>();
    
    @Override
    public void command(String dname) {
        map.get(dname).selfAction();
    }

    @Override
    public void register(String dname, Department d) {
        map.put(dname, d);
    }
}      

建立同僚接口

/**
 * 同僚類的接口
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public interface Department {
    void selfAction(); //做本部門的事情
    void outAction();  //向總經理發出申請
}      

建立同僚實作類

市場部

/**
 * 市場部
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public class Market implements Department {

    private Mediator m;  //持有中介者(總經理)的引用
    
    public Market(Mediator m) {
        super();
        this.m = m;
        m.register("market", this);
    }

    @Override
    public void outAction() {
        System.out.println("彙報工作!項目承接的進度,需要資金支援!");
        
        m.command("finacial");
        
    }

    @Override
    public void selfAction() {
        System.out.println("跑去接項目!");
    }
}      

财務部

/**
 * 财務部
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public class Financial implements Department {

    private Mediator m;  //持有中介者(總經理)的引用
    
    public Financial(Mediator m) {
        super();
        this.m = m;
        m.register("finacial", this);
    }

    @Override
    public void outAction() {
        System.out.println("彙報工作!沒錢了,錢太多了!怎麼花?");
    }

    @Override
    public void selfAction() {
        System.out.println("數錢!");
    }

}      

開發部

/**
 * 開發部
 * @author 波波烤鴨
 * @email [email protected]
 *
 */
public class Development implements Department {

    private Mediator m;  //持有中介者(總經理)的引用
    
    public Development(Mediator m) {
        super();
        this.m = m;
        m.register("development", this);
    }

    @Override
    public void outAction() {
        System.out.println("彙報工作!沒錢了,需要資金支援!");
    }

    @Override
    public void selfAction() {
        System.out.println("專心科研,開發項目!");
    }

}      

用戶端

public class Client {
    public static void main(String[] args) {
        // 擷取中介者對象
        Mediator m = new President();
        // 擷取同僚對象,執行個體化的時候會在中介者對象中注冊
        Market   market = new Market(m);
        Development devp = new Development(m);
        Financial f = new Financial(m);
        
        market.selfAction();
        market.outAction();
    }
}      

中介者模式的本質:

 解耦多個同僚對象之間的互動關系。每個對象都持有中介者對象的引用,隻跟中介者對象打交道。我們通過中介者對象統一管理這些互動關系

開發中常見的場景:

   MVC模式(其中的C,控制器就是一個中介者對象。M和V都和他打交道) – 視窗遊戲程式,視窗軟體開發中視窗對象也是一個中介者對象

   圖形界面開發GUI中,多個元件之間的互動,可以通過引入一個中介者對象來解決,可以是整體的視窗對象或者DOM對象

   Java.lang.reflect.Method#invoke()