中介者模式包含以下幾個角色: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("是的!請問你須要租嗎?"); } }