中介者模式(Mediator)

1、概念

中介者模式用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互,屬于對象行為型模式一種。


未命名文件(7).png

2、模式結(jié)構(gòu)

  • Mediator: 抽象中介者,定義一個接口,該接口用于與各同事對象之間進行通信
  • ConcreteMediator: 具體中介者,抽象中介者的子類,通過協(xié)調(diào)各個同事對象來實現(xiàn)協(xié)作行為,它維持了對各個同事對象的引用
  • Colleague: 抽象同事類,定義各個同事類公有的方法,并聲明了一些抽象方法來供子類實現(xiàn),同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信
  • ConcreteColleague: 具體同事類,是抽象同事類的子類;每一個同事對象在需要和其他同事對象通信時,先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實現(xiàn)了在抽象同事類中聲明的抽象方法

3、使用場景

  • 系統(tǒng)中對象之間存在復(fù)雜的引用關(guān)系,系統(tǒng)結(jié)構(gòu)混亂且難以理解
  • 一個對象由于引用了其他很多對象并且直接和這些對象通信,導(dǎo)致難以復(fù)用該對象
  • 想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類
  • 交互的公共行為,如果需要改變行為則可以增加新的中介者類

4、優(yōu)缺點

優(yōu)點:

  • 降低了類的復(fù)雜度,將一對多轉(zhuǎn)化成了一對一
  • 將系統(tǒng)的各個對象之間的相互關(guān)系進行封裝,使各同事類解耦
  • 減少子類生成
  • 可以簡化各同事類的設(shè)計和實現(xiàn)

缺點:

  • 由于中介者對象封裝了系統(tǒng)中對象之間的相互關(guān)系,導(dǎo)致其變得非常復(fù)雜,使得系統(tǒng)維護比較困難

5、實例

定義抽象同事Person

public abstract class Person {
    private String name;
    private Mediator mediator;

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

    public String getName() {
        return name;
    }

    public Mediator getMediator() {
        return mediator;
    }
}

定義具體同事類Landlord

public class Landlord extends Person {

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

    /**
     * @desc 與中介者聯(lián)系
     * @param message
     * @return void
     */
    public void contact(String message){
        getMediator().contact(message, this);
    }

    /**
     * @desc 獲取信息
     * @param message
     * @return void
     */
    public void getMessage(String message){
        System.out.println("房東:" + getName() +",獲得信息:" + message);
    }
}

定義具體同事類Renters

public class Renters extends Person {

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

    /**
     * @desc 與中介者聯(lián)系
     * @param message
     * @return void
     */
    public void contact(String message){
        getMediator().contact(message, this);
    }

    /**
     * @desc 獲取信息
     * @param message
     * @return void
     */
    public void getMessage(String message){
        System.out.println("租房者:" + getName() +",獲得信息:" + message);
    }
}

定義抽象中介者Mediator

public abstract class Mediator {
    //申明一個聯(lián)絡(luò)方法
    public abstract void contact(String message, Person person);
}

定義具體中介者MediatorStructure

public class MediatorStructure extends Mediator {

    //首先中介結(jié)構(gòu)必須知道所有房主和租房者的信息
    private Landlord landlord;
    private Renters renters;

    public Landlord getLandlord() {
        return landlord;
    }

    public Renters getRenters() {
        return renters;
    }

    public void setLandlord(Landlord landlord) {
        this.landlord = landlord;
    }

    public void setRenters(Renters renters) {
        this.renters = renters;
    }

    public void contact(String message, Person person) {
        if (person == landlord) {          //如果是房主,則租房者獲得信息
            renters.getMessage(message);
        } else {       //反正則是房主獲得信息
            landlord.getMessage(message);
        }
    }
}

客戶端調(diào)用

//一個房主、一個租房者、一個中介機構(gòu)
MediatorStructure mediator = new MediatorStructure();

//房主和租房者只需要知道中介機構(gòu)即可
Landlord landlord = new Landlord("張三", mediator);
Renters renters = new Renters("李四", mediator);

//中介結(jié)構(gòu)要知道房主和租房者
mediator.setLandlord(landlord);
mediator.setRenters(renters);

renters.contact("聽說你那里有房出租.....");
landlord.contact("是的!請問你需要租什么類型的房?");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 如果沒有主板## 大家都知道,電腦里面各個配件之間的交互,主要是通過主板來完成的(事實上主...
    七寸知架構(gòu)閱讀 2,295評論 0 56
  • 【學(xué)習(xí)難度:★★★☆☆,使用頻率:★★☆☆☆】直接出處:中介者模式梳理和學(xué)習(xí):https://github.com...
    BruceOuyang閱讀 903評論 0 2
  • 設(shè)計模式概述 在學(xué)習(xí)面向?qū)ο笃叽笤O(shè)計原則時需要注意以下幾點:a) 高內(nèi)聚、低耦合和單一職能的“沖突”實際上,這兩者...
    彥幀閱讀 3,879評論 0 14
  • 1.初識中介者模式 用一個中介對象來封裝一系列的對象交互。中介者使得各對象不需要顯式地相互引用,從而使其耦合松散,...
    王偵閱讀 508評論 0 0
  • 產(chǎn)品經(jīng)理第三堂課的內(nèi)容令人回味無窮。在課后我問自己如何看待微信的成功這件事時,在我看來,成功是偶然的,它是個故事,...
    撩科技閱讀 455評論 0 1

友情鏈接更多精彩內(nèi)容