JAVA設計模式之 中介者模式【Mediator Pattern】
一、概述
用一箇中介物件(中介者)來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式又稱為調停者模式,它是一種物件行為型模式。
二、適用場景
協調多個物件之間的互動。
三、UML類圖
四、參與者
1、Mediator(抽象中介者):它定義一個介面,該介面用於與各同事物件之間進行通訊。
2、ConcreteMediator(具體中介者):它是抽象中介者的子類,通過協調各個同事物件來實現協作行為,它維持了對各個同事物件的引用。
3、Colleague(抽象同事類):它定義各個同事類公有的方法,並宣告瞭一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通訊。
4、ConcreteColleague(具體同事類):它是抽象同事類的子類;每一個同事物件在需要和其他同事物件通訊時,先與中介者通訊,通過中介者來間接完成與其他同事類的通訊;在具體同事類中實現了在抽象同事類中宣告的抽象方法。
五、用例學習[用例背景:求租者 - 房屋出租中介 - 房東 的故事]
1、抽象同事類:Person.java
/**
* 抽象同事類:
* @author lvzb.software@qq.com
*
*/
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 lvzb.software@qq.com
*
*/
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 lvzb.software@qq.com
*
*/
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 lvzb.software@qq.com
*
*/
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 lvzb.software@qq.com
*
*/
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 lvzb.software@qq.com
*
*/
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/月 光線好 近公交站
相關文章
- 中介者模式(Mediator Pattern)。模式
- 設計模式--中介者模式Mediator(行為型)設計模式
- 設計模式系列之中介者模式(Mediator Pattern)——協調多個物件之間的互動設計模式物件
- Rust語言之GoF設計模式:中介者Mediator模式RustGo設計模式
- 設計模式的征途—22.中介者(Mediator)模式設計模式
- 設計模式之Mediator(中介者)這樣理解 對嗎?設計模式
- JAVA設計模式之 建造者模式【Builder Pattern】Java設計模式UI
- Java設計模式之裝飾者模式(Decorator pattern)Java設計模式
- JAVA設計模式之 訪問者模式【Visitor Pattern】Java設計模式
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- Objective-C設計模式——中介者Mediator(物件去耦)Object設計模式物件
- 設計模式系列之「中介者模式」設計模式
- JAVA設計模式之 代理模式【Proxy Pattern】Java設計模式
- 我的Java設計模式-中介者模式Java設計模式
- Java學設計模式之中介者模式Java設計模式
- JAVA設計模式之 裝飾模式【Decorator Pattern】Java設計模式
- JAVA設計模式之 原型模式【Prototype Pattern】Java設計模式原型
- JAVA設計模式之 狀態模式【State Pattern】Java設計模式
- JAVA設計模式之 命令模式【Command Pattern】Java設計模式
- JAVA設計模式之 迭代器模式【Iterator Pattern】Java設計模式
- Java進階篇設計模式之十 ---- 訪問者模式和中介者模式Java設計模式
- 折騰Java設計模式之中介者模式Java設計模式
- 18.java設計模式之中介者模式Java設計模式
- 設計模式--建造者模式(Builder Pattern)設計模式UI
- Java設計模式之單例模式(Singleton Pattern)Java設計模式單例
- JAVA設計模式之 橋接模式【Bridge Pattern】Java設計模式橋接
- JAVA設計模式之 單例模式【Singleton Pattern】Java設計模式單例
- JAVA設計模式之 模板方法模式【Template Method Pattern】Java設計模式
- 設計模式之中介者模式設計模式
- 設計模式(十四)中介者模式設計模式
- 設計模式(十一):中介者模式設計模式
- 設計模式之代理模式(proxy pattern)設計模式
- 軟體設計模式系列之十九——中介者模式設計模式
- JAVA設計模式之 備忘錄模式【Memento Pattern】Java設計模式
- JAVA設計模式之 工廠方法模式【Factory Method Pattern】Java設計模式
- JAVA設計模式之 抽象工廠模式【Abstract Factory Pattern】Java設計模式抽象
- Net設計模式例項之裝飾者模式(Decorator Pattern)設計模式
- JAVA設計模式之中介模式Java設計模式