一、概述
用一箇中介對象(中介者)來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。中介者模式又稱爲調停者模式,它是一種對象行爲型模式。
二、適用場景
協調多個對象之間的交互。
三、UML類圖
四、參與者
1、Mediator(抽象中介者):它定義一個接口,該接口用於與各同事對象之間進行通信。
2、ConcreteMediator(具體中介者):它是抽象中介者的子類,通過協調各個同事對象來實現協作行爲,它維持了對各個同事對象的引用。
3、Colleague(抽象同事類):它定義各個同事類公有的方法,並聲明瞭一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信。
4、ConcreteColleague(具體同事類):它是抽象同事類的子類;每一個同事對象在需要和其他同事對象通信時,先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實現了在抽象同事類中聲明的抽象方法。
五、用例學習[用例背景:求租者 - 房屋出租中介 - 房東 的故事]
1、抽象同事類:Person.java
/**
* 抽象同事類:
* @author [email protected]
*
*/
public abstract class Person {
// 維持一個抽象中介者的引用
protected Mediator mediator;
protected String name;
public Person(String name, Mediator mediator){
this.mediator = mediator;
this.name = name;
}
/**
* 設置中介者對象
* @param mediator
*/
public void setMediator(Mediator mediator){
this.mediator = mediator;
}
/**
* 向中介 發送消息
*/
protected abstract void sendMessage(String msg);
/**
* 從中介 獲取消息
*/
protected abstract void getMessage(String msg);
}
2、房屋求租者 Renter.java
/**
* 具體同事類:這裏的角色是 租房者
* @author [email protected]
*
*/
public class Renter extends Person {
public Renter(String name, Mediator mediator) {
super(name, mediator);
}
@Override
protected void sendMessage(String msg) {
mediator.operation(this, msg);
}
@Override
protected void getMessage(String msg) {
System.out.println("求租者[" + name + "]收到中介發來的消息: " + msg);
}
}
3、具體同事類 房屋出租者[房東] Landlord.java
/**
* 具體同事類:這裏的角色是 房東
* @author [email protected]
*
*/
public class Landlord extends Person {
public Landlord(String name, Mediator mediator) {
super(name,mediator);
}
@Override
protected void sendMessage(String msg) {
mediator.operation(this, msg);
}
@Override
protected void getMessage(String msg) {
System.out.println("房東["+ name +"]收到中介發來的消息:" + msg);
}
}
4、抽象中介者類:Mediator.java
/**
* 抽象中介者類
* @author [email protected]
*
*/
public abstract class Mediator {
// 用於添加儲存 "房東"角色
protected List<Person> landlordList = new ArrayList<Person>();
// 用於添加儲存 "求租者"角色
protected List<Person> renterList = new ArrayList<Person>();
/**
* 中介者註冊房東信息
* @param landlord 房東實體
*/
public void registerLandlord(Person landlord){
landlordList.add(landlord);
}
/**
* 中介者註冊 求租者信息
* @param landlord 房東實體
*/
public void registerRenter(Person landlord){
renterList.add(landlord);
}
/**
* 聲明抽象方法 由具體中介者子類實現 消息的中轉和協調
*/
public abstract void operation(Person person, String message);
}
5、具體中介者類:房屋中介 HouseMediator.java
/**
* 具體中介者類:這裏的角色是 房屋出租中介
* @author [email protected]
*
*/
public class HouseMediator extends Mediator {
@Override
public void operation(Person person, String message) {
if(person instanceof Renter){
// 將租屋的需求消息傳遞給 註冊了的房東們
for(Person landlord: landlordList){
landlord.getMessage(message);
}
} else if(person instanceof Landlord){
// 將房東的出租房消息傳遞給 註冊了的 房屋求租者們
for(Person renter : renterList){
renter.getMessage(message);
}
}
}
}
6、客戶端測試類 Client.java
/**
* 客戶端測試類
* @author [email protected]
*
*/
public class Client {
public static void main(String[] args) {
// 實例化房屋中介
Mediator mediator = new HouseMediator();
Person landlordA, landlordB, renter;
landlordA = new Landlord("房東李", mediator);
landlordB = new Landlord("房東黎", mediator);
renter = new Renter("小呂",mediator);
// 房東註冊中介
mediator.registerLandlord(landlordA);
mediator.registerLandlord(landlordB);
// 求租者註冊中介
mediator.registerRenter(renter);
// 求租者 發送求租消息
renter.sendMessage("在天河公園附近租套房子,價格1000元左右一個月");
System.out.println("--------------------------");
// 房東A 發送房屋出租消息
landlordA.sendMessage("天河公園學院站三巷27號四樓有一房一廳出租 1200/月 光線好 近公交站");
}
}
7、運行結果:
房東[房東李]收到中介發來的消息:在天河公園附近租套房子,價格1000元左右一個月
房東[房東黎]收到中介發來的消息:在天河公園附近租套房子,價格1000元左右一個月
--------------------------
求租者[小呂]收到中介發來的消息: 天河公園學院站三巷27號四樓有一房一廳出租 1200/月 光線好 近公交站