意圖
定義一箇中介對象來封裝系列對象之間的交互。中介者使各個對象不需要顯示地相互引用,從而使其耦合性鬆散,而且可以獨立地改變他們之間的交互。
適用性
1、一組對象以定義良好但是複雜的方式進行通信。產生的相互依賴關係結構混亂且難以理解。
2、一個對象引用其他很多對象並且直接與這些對象通信,導致難以複用該對象。
3、想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。
結構圖
角色
Mediator:中介者接口。在裏面定義了各個同事之間相互交互所需要的方法,可以是公共的方法,如Change方法,也可以是小範圍的交互方法。
ConcreteMediator:具體的中介者實現對象。它需要了解併爲維護每個同事對象,並負責具體的協調各個同事對象的交互關係。
Colleague:同事類的定義,通常實現成爲抽象類,主要負責約束同事對象的類型,並實現一些具體同事類之間的公共功能,比如,每個具體同事類都應該知道中介者對象,也就是每個同事對象都會持有中介者對象的引用,這個功能可定義在這個類中。
ConcreteColleague:具體的同事類,實現自己的業務,需要與其他同事對象交互時,就通知中介對象,中介對象會負責後續的交互。
實現
中介者
public abstract class Mediator {
//申明一個聯絡方法
public abstract void constact(String message,Person person);
}
然後是抽象同事對象:Person.java
public abstract class Person {
protected String name;
protected Mediator mediator;
Person(String name,Mediator mediator){
this.name = name;
this.mediator = mediator;
}
}
兩個具體同事類:HouseOwner.java
public class HouseOwner extends Person{
HouseOwner(String name, Mediator mediator) {
super(name, mediator);
}
/**
* @desc 與中介者聯繫
* @param message
* @return void
*/
public void constact(String message){
mediator.constact(message, this);
}
/**
* @desc 獲取信息
* @param message
* @return void
*/
public void getMessage(String message){
System.out.println("房主:" + name +",獲得信息:" + message);
}
}
Tenant.java
public class Tenant extends Person{
Tenant(String name, Mediator mediator) {
super(name, mediator);
}
/**
* @desc 與中介者聯繫
* @param message
* @return void
*/
public void constact(String message){
mediator.constact(message, this);
}
/**
* @desc 獲取信息
* @param message
* @return void
*/
public void getMessage(String message){
System.out.println("租房者:" + name +",獲得信息:" + message);
}
}
具體中介者對象:中介結構、MediatorStructure.java
public class MediatorStructure extends Mediator{
//首先中介結構必須知道所有房主和租房者的信息
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;
}
public void constact(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) {
//一個房主、一個租房者、一箇中介機構
MediatorStructure mediator = new MediatorStructure();
//房主和租房者只需要知道中介機構即可
HouseOwner houseOwner = new HouseOwner("張三", mediator);
Tenant tenant = new Tenant("李四", mediator);
//中介結構要知道房主和租房者
mediator.setHouseOwner(houseOwner);
mediator.setTenant(tenant);
tenant.constact("聽說你那裏有三室的房主出租.....");
houseOwner.constact("是的!請問你需要租嗎?");
}
}
優缺點
優點
1.降低了系統對象之間的耦合性,使得對象易於獨立的被複用。
2.提高系統的靈活性,使得系統易於擴展和維護。
缺點
中介者模式的缺點是顯而易見的,因爲這個“中介“承擔了較多的責任,所以一旦這個中介對象出現了問題,那麼整個系統就會受到重大的影響。
總結
1、 在中介者模式中通過引用中介者對象,將系統中有關的對象所引用的其他對象數目減少到最少。它簡化了系統的結構,將系統由負責的網狀結構轉變成簡單的星形結構,中介者對象在這裏起到中轉和協調作用。
2、 中介者類是中介者模式的核心,它對整個系統進行控制和協調,簡化了對象之間的交互,還可以對對象間的交互進行進一步的控制。
3、 通過使用中介者模式,具體的同事類可以獨立變化,通過引用中介者可以簡化同事類的設計和實現。
4、 就是由於中介者對象需要知道所有的具體同事類,封裝具體同事類之間相互關係,導致中介者對象變得非常複雜,系統維護起來較爲困難。