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

設計模式——中介者模式

解耦 用戶名 進行 edi 目標 tac visitor 適用場景 行為

  • 中介者模式定義
    中介者對象封裝系列的對象交互,中介者使得對象不需要顯示地相互作用,從而松耦合,能夠獨立改變它們之間的交互。

  • 中介者模式角色
    抽象中介者: 用於各個同事類之間的通信,同事類對象到中介者對象的接口。包括一個或幾個抽象的事件方法,由子類實現。
    中介者實現類: 從一個同事類接收消息,通過消息影響其他同事類
    同事類: 如果一個對象會影響其他類,同時也會被其他類影響,這兩個類互為同事類。

  • 使用中介者模式的原因
    一般來說,同事類之間的關系是比較復雜的,多個同事類之間互相關聯時,他們之間的關系會呈現為復雜的網狀結構,這是一種過度耦合的架構,即不利於類的復用,也不穩定。

    在使用了中介者模式之後,同事類之間關系變成星型結構,由專門的類統一管理他們之間的關系。

  • UML 圖

技術分享圖片

  • 中介者模式例子
    相對於機票購買這件事來說,客戶、各航司、各代理商之間其實就有錯綜復雜。而去哪網的出現目標就是將這些錯綜復雜的關系整合,以去哪兒網平臺為核心,呈現一個星型結構。
    public class User {

    /**
     * 用戶名稱
     */
    protected String name;

    /**
     * 中介者
     */
    protected Mediator mediator;

    public User(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Mediator getMediator() {
        return mediator;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
}
    public class Visitor extends User {


    public Visitor(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 與中介者聯系
     *
     * @param message
     */
    public void constact(String message) {
        mediator.constact(message, this);
    }

    public void getMessage(String message) {
        System.out.println("訪問者:" + name + ",獲取信息:" + message);
    }
}
    public class Agents extends User {

    public Agents(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 與中介者聯系
     *
     * @param message
     */
    public void constact(String message) {
        mediator.constact(message, this);
    }

    public void getMessage(String message) {
        System.out.println("代理商:" + name + ",獲取信息:" + message);
    }
}
    public interface Mediator {

    void constact(String message,User user);
}
    public class MediatorStructure implements Mediator {

    /**
     * 代理商
     */
    private Agents agents;

    /**
     * 用戶
     */
    private Visitor visitor;


    public Agents getAgents() {
        return agents;
    }

    public void setAgents(Agents agents) {
        this.agents = agents;
    }

    public Visitor getVisitor() {
        return visitor;
    }

    public void setVisitor(Visitor visitor) {
        this.visitor = visitor;
    }

    public void constact(String message, User user) {
        //如果是代理商,則訪問者獲得信息
        if (user == agents) {
            visitor.getMessage(message);
        } else {
            agents.getMessage(message);
        }
    }
}
    public class Client {

    public static void main(String[] args) {

        MediatorStructure mediator = new MediatorStructure();

        Agents agents = new Agents("xxx機票代理商", mediator);
        Visitor visitor = new Visitor("李四", mediator);
        mediator.setAgents(agents);
        mediator.setVisitor(visitor);

        agents.constact("聽說便宜機票.....");
        visitor.constact("是的,需要機票嗎?");

    }

}
  • 優點
    1、 簡化了對象之間的關系,將系統的各個對象之間的相互關系進行封裝,將各個同事類解耦,使系統成為松耦合系統。

    2、 減少了子類的生成。

    3 、 可以減少各同事類的設計與實現。

  • 缺點
    由於中介者對象封裝了系統中對象之間的相互關系,導致其變得非常復雜,使得系統維護比較困難。

  • 適用場景
    1、 系統中對象之間存在比較復雜的引用關系,導致他們之間的依賴關系結構混亂而且難以復用該對象。

    2、 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。

設計模式——中介者模式