設計模式之中介者

中介者模式

簡介

仔細觀察周邊事物,存在著很多很多的中介者.例如租房、租車、游戲平臺等.可以充當一個平臺的作用,讓不同用戶之間交互更方便.不同個體之間存在著強關聯(lián)關系,很導致很嚴重的問題.例如
1、對象和對象之間的強依賴,會導致系統(tǒng)的復雜性加劇,當一個對象發(fā)生改變的時候,需要跟蹤關聯(lián)對象也修改.
2、對象之間關聯(lián)導致可復用性下降.
3、系統(tǒng)的擴展性降低.

中介者模式,定義了一個中介對象來封裝一系列對象之間的交互關系。中介者使各個對象之間不需要顯式地相互引用,從而使耦合性降低,而且可以獨立地改變它們之間的交互行為。

分析

中介者模式UML.png

包含如下角色:
1、Mediator:抽象中介者.用于定義同事對象到中介者對象之間的接口。
2、ConcreteMediator:具體中介者.需要知道所有同事類,以及同事類之間的傳遞事件.
3、Colleague:抽象同事類.
4、ConcreteColleague具體同事類.

例子

抽象中介者類

/**
 * ClassName: Mediator 
 * Author: william_zhang
 * Date: 2019/3/10 10:49 PM
 **/
public interface Mediator {
    //中介執(zhí)行方法
    void execute(String message, Person person);
}

抽象同事類

/**
 * ClassName: Person 
 * Author: william_zhang
 * Date: 2019/3/10 10:50 PM
 **/
public abstract class Person {
    protected String name;
    //中介者
    protected Mediator mediator;

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

    public abstract void dealMessage(String message);
}

具體同事類
1、租房的人

/**
 * ClassName: RentPerson 
 * Author: william_zhang
 * Date: 2019/3/10 10:56 PM
 **/
public class RentPerson extends Person {
    public RentPerson(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    public void dealMessage(String message) {
        System.out.println("RentPerson:" + "收到啦");
    }

    public void sendMessage(String message) {
        System.out.println("RentPerson send:" + message);
        mediator.execute(message, this);
    }
}

2、出租的人

/**
 * ClassName: HousePerson 
 * Author: william_zhang
 * Date: 2019/3/10 10:54 PM
 **/
public class HousePerson extends Person {
    public HousePerson(String name, Mediator mediator) {
        super(name, mediator);
    }

    @Override
    public void dealMessage(String message) {
        System.out.println("HousePerson:" + "收到啦");
    }


    public void sendMessage(String message) {
        System.out.println("HousePerson send:" + message);
        mediator.execute(message, this);
    }
}

具體中介者


/**
 * ClassName: ConcreteMediator 
 * Author: william_zhang
 * Date: 2019/3/10 10:53 PM
 **/
public class ConcreteMediator implements Mediator {
    private HousePerson housePerson;

    private RentPerson rentPerson;

    public void setHousePerson(HousePerson housePerson) {
        this.housePerson = housePerson;
    }

    public void setRentPerson(RentPerson rentPerson) {
        this.rentPerson = rentPerson;
    }

    /**
     * 處理具體邏輯的中介方法
     * @param message 消息
     * @param person 對應人
     */
    @Override
    public void execute(String message, Person person) {
        if (person instanceof HousePerson) {
            rentPerson.dealMessage(message);
        }

        if (person instanceof RentPerson) {
            housePerson.dealMessage(message);
        }
    }
}

Main方法

/**
 * ClassName: Main 
 * Author: william_zhang
 * Date: 2019/3/10 10:57 PM
 **/
public class Main {
    public static void main(String[] args) {
        ConcreteMediator concreteMediator = new ConcreteMediator();
        HousePerson housePerson = new HousePerson("william", concreteMediator);
        RentPerson rentPerson = new RentPerson("xiaoming", concreteMediator);
        concreteMediator.setHousePerson(housePerson);
        concreteMediator.setRentPerson(rentPerson);
        housePerson.sendMessage("你好啊");
        rentPerson.sendMessage("房子多少錢");
    }
}

優(yōu)缺點

優(yōu)點

1、簡化對象之間的關聯(lián)程度.將各個同事類解偶.
2、簡化同事類的設計和實現(xiàn).

缺點

1、中介者的邏輯關系會變得非常復雜.

適用場景

1、系統(tǒng)對象之間存在復雜的引用關系,依賴復雜.
2、中間類封裝多個類的行為.

總結

中轉協(xié)作
中介者對同事類之間的關系進行封裝,同事類在不需要知道其他對象的情況下通過中介者與其他對象完成通信。在這個過程中同事類是不需要指明中介者該如何做,中介者可以根據(jù)自身的邏輯來進行協(xié)調,對同事的請求進一步處理,將同事成員之間的關系行為進行分離和封裝。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 前天,和兒子去坐摩天輪 沒上去之前 每件事都很大 大車子,大房子,大樹,大導演 上去了之后 每件事都很小 小車子,...
    三三不惑閱讀 755評論 4 27
  • 歲去年來復幾時,槐楊挽著翠黃鸝。 群芳不解東風意,最是春梅第一枝。
    江寒RiversFrigid閱讀 225評論 0 1

友情鏈接更多精彩內容