19_中介者模式

  • 又稱調(diào)停模式,定義一個(gè)中介角色來(lái)封裝一系列對(duì)象之間的交互,使原有對(duì)象之間的耦合松散,且可以獨(dú)立地改變它們之間的交互。
  • 其實(shí)中介者模式是單一職責(zé)的體現(xiàn),對(duì)于類來(lái)說(shuō),它僅僅包含自己的行為,將對(duì)象之間的交互封裝到一個(gè)專門的類來(lái)管理。
  • 將一對(duì)多的關(guān)系,轉(zhuǎn)換成雙向一對(duì)一的關(guān)系。

結(jié)構(gòu)

  • 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事對(duì)象注冊(cè)與轉(zhuǎn)發(fā)同事對(duì)象信息的抽象方法。
  • 具體中介者(ConcreteMediator)角色:實(shí)現(xiàn)中介者接口,定義一個(gè) List 來(lái)管理同事對(duì)象,協(xié)調(diào)各個(gè)同事角色之間的交互關(guān)系,因此它依賴于同事角色。
  • 抽象同事類(Colleague)角色:定義同事類的接口,保存中介者對(duì)象,提供同事對(duì)象交互的抽象方法,實(shí)現(xiàn)所有相互影響的同事類的公共功能。
  • 具體同事類(Concrete Colleague)角色:是抽象同事類的實(shí)現(xiàn)者,當(dāng)需要與其他同事對(duì)象交互時(shí),由中介者對(duì)象負(fù)責(zé)后續(xù)的交互。

實(shí)例

  • 現(xiàn)在租房基本都是通過(guò)房屋中介,房主將房屋托管給房屋中介,而租房者從房屋中介獲取房屋信息。房屋中介充當(dāng)租房者與房屋所有者之間的中介者。
// 抽象同事類
// Person.java
public abstract class Person {
    protected String name;
    protected Mediator mediator;

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

// 具體同事角色類
// HouseOwner.java
public class HouseOwner extends Person{
    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    // 和中介溝通的方法
    public void contact(String message){
        mediator.contact(message,this);
    }

    // 獲取信息的方法
    public void getMessage(String message){
        System.out.println("房主:" + name + "收到的信息:" + message);
    }
}

// 具體同事角色類
// Tenant.java
public class Tenant extends Person{
    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    // 和中介溝通的方法
    public void contact(String message){
        mediator.contact(message,this);
    }

    // 獲取信息的方法
    public void getMessage(String message){
        System.out.println("租房者:" + name + "收到的信息:" + message);
    }
}

// 抽象中介者類
// Mediator.java
public abstract class Mediator {
    public abstract void contact(String message,Person person);
}

// 具體中介者角色類
// MediatorStructure.java
public class MediatorStructure extends Mediator{

    // 聚合房主和租房者對(duì)象
    private HouseOwner houseOwner;
    private Tenant tenant;

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    @Override
    public void contact(String message, Person person) {
        if(person == houseOwner){
            tenant.getMessage(message);
        }else{
            houseOwner.getMessage(message);
        }
    }
}

// Client.java
public class Client {
    public static void main(String[] args) {
        // 創(chuàng)建中介者對(duì)象
        MediatorStructure mediator = new MediatorStructure();

        // 創(chuàng)建兩個(gè)同事類對(duì)象
        // 創(chuàng)建租房者對(duì)象
        Tenant tenant = new Tenant("李四",mediator);
        // 創(chuàng)建房主對(duì)象
        HouseOwner houseOwner = new HouseOwner("張三",mediator);

        // 中介者要知道具體的房主和租房者
        mediator.setTenant(tenant);
        mediator.setHouseOwner(houseOwner);

        tenant.contact("今天天氣怎么樣");
        houseOwner.contact("今天下暴雨了");
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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