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("是的!請問你需要租什么類型的房?");