2三、行爲型-中介者模式(Mediator)

中介者模式(Mediator Pattern):用一箇中介對象(中介者)來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。中介者模式又稱爲調停者模式,它是一種對象行爲型模式。

中介者模式包含以下幾個角色:java

● Mediator(抽象中介者):它定義一個接口,該接口用於與各同事對象之間進行通訊。
● ConcreteMediator(具體中介者):它是抽象中介者的子類,經過協調各個同事對象來實現協做行爲,它維持了對各個同事對象的引用。
● Colleague(抽象同事類):它定義各個同事類公有的方法,並聲明瞭一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類能夠經過該引用來與中介者通訊。
● ConcreteColleague(具體同事類):它是抽象同事類的子類;每個同事對象在須要和其餘同事對象通訊時,先與中介者通訊,經過中介者來間接完成與其餘同事類的通訊;在具體同事類中實現了在抽象同事類中聲明的抽象方法

一、主要優勢測試

(1) 中介者模式簡化了對象之間的交互,它用中介者和同事的一對多交互代替了原來同事之間的多對多交互,一對多關係更容易理解、維護和擴展,將本來難以理解的網狀結構轉換成相對簡單的星型結構。
(2) 中介者模式可將各同事對象解耦。中介者有利於各同事之間的鬆耦合,咱們能夠獨立的改變和複用每個同事和中介者,增長新的中介者和新的同事類都比較方便,更好地符合「開閉原則」。
(3) 能夠減小子類生成,中介者將本來分佈於多個對象間的行爲集中在一塊兒,改變這些行爲只需生成新的中介者子類便可,這使各個同事類可被重用,無須對同事類進行擴展。

二、主要缺點this

在具體中介者類中包含了大量同事之間的交互細節,可能會致使具體中介者類很是複雜,使得系統難以維護。

三、適用場景code

(1) 系統中對象之間存在複雜的引用關係,系統結構混亂且難以理解。
(2) 一個對象因爲引用了其餘不少對象而且直接和這些對象通訊,致使難以複用該對象。
(3) 想經過一箇中間類來封裝多個類中的行爲,而又不想生成太多的子類。能夠經過引入中介者類來實現,在中介者中定義對象交互的公共行爲,若是須要改變行爲則能夠增長新的具體中介者類。

咱們就以租房爲例,中介機構充當租房者與房屋全部者之間的中介者對象

輸入圖片說明

/**
 * 2018/12/6
 * 抽象中介者
 *
 * @author machuanpeng
 */ 
public abstract class Mediator {
    //申明一個聯絡方法
    public abstract void constact(String message,Person person);
}
/**
 * 2018/12/6
 * 抽象同事對象
 *
 * @author machuanpeng
 */
public abstract class Person {
    
    protected String name;
    protected Mediator mediator;
    
    Person() {}
    
    Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
    
    /**與中介者聯繫*/
    public void constact(String message){
        mediator.constact(message, this);
    }

    /**獲取信息*/
    public void getMessage(String message);
    
    public void getName() {
        return this.name;
	}
    
    public void setName(String name) {
        this.name = name;
	}
    
    public void getMediator() {
        return this.mediator;
	}
    
    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
	}
}
/**
 * 2018/12/6
 * 房主
 *
 * @author machuanpeng
 */
public class HouseOwner extends Person{

    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void getMessage(String message){
        System.out.println("房主:" + name +",得到信息:" + message);
    }
}
/**
 * 2018/12/6
 * 租客
 *
 * @author machuanpeng
 */
public class Renter extends Person{

    Renter(String name, Mediator mediator) {
        super(name, mediator);
    }

    public void getMessage(String message){
        System.out.println("租客:" + name +",得到信息:" + message);
    }
}
/**
 * 2018/12/6
 * 具體中介者對象
 *
 * @author machuanpeng
 */
public class MediatorStructure extends Mediator{
    //首先中介結構必須知道全部房主和租房者的信息
    private HouseOwner houseOwner;
    private Renter renter;
    
    public void constact(String message, Person person) {
        if(person == houseOwner){ 
            //若是是房主,則租房者得到信息
            renter.getMessage(message);
        }else{ 
            //反正則是房主得到信息
            houseOwner.getMessage(message);
        }
    }

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

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

    public Renter getRenter() {
        return renter;
    }

    public void setRenter(Renter renter) {
        this.renter = renter;
    }
}

測試:blog

public class Client {
    public static void main(String[] args) {
        //一個房主、一個租房者、一箇中介機構
        MediatorStructure mediator = new MediatorStructure();
        
        //房主和租房者只須要知道中介機構便可
        HouseOwner houseOwner = new HouseOwner("張三", mediator);
        Renter renter = new Renter("李四", mediator);
        
        //中介結構要知道房主和租房者
        mediator.setHouseOwner(houseOwner);
        mediator.setRenter(renter);
        
        renter.constact("據說你那裏有三室的房主出租.....");
        houseOwner.constact("是的!請問你須要租嗎?");
    }
}
相關文章
相關標籤/搜索