寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用,主要是下面的UML圖可以起到大作用,在你學習過一遍以后可能會遺忘,忘記了不要緊,只要看一眼UML圖就能想起來了。同時也請大家多多指教。
中介者模式(Mediator)
對象行為型模式。
目錄
一、概述
1.1、直觀的理解:
1.2、主要角色:
1.3、描述對象之間關系的UML圖:
1.4、適用場景:
二、代碼舉例
2.1、對象之間的關系用UML圖描述如下:
2.2、Java代碼如下:
一、概述
1、用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
1.1、直觀的理解:
假設現有4個同事類對象,要讓他們之間可以兩兩交互,對比普通方式和中介者模式的區別:
可以看到,在沒有使用中介者模式時每個同事類都要產生3個給對方發送消息和3個接收消息的動作,如果是有很多的同事,那么在想要修改時會非常復雜。而使用中介者后,每個同事類只需要1個給中介發消息和1個接收中介者消息的動作,同事類之間的交互都由中介者轉發,且都是和中介者進行交互,大大的減少了同事類之間的耦合。
1.2、主要角色:
- 中介者:中介者的抽象類和接口 + 具體的中介者類,協調同事類們之間的通訊
- 同事類:同事類的抽象類和接口 + 具體的同事類,需要通訊的對象
1.3、描述對象之間關系的UML圖:
(我們會發現,這相當于把同事類之間的交互控制全部放到了中介者類里,此時中介類會變得比任何一個同事類都復雜)
1.4、適用場景:
- 一組對象以定義良好但復雜的方式進行通訊,產生的相互依賴關系結構混亂且難以理解
- 一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象
- 想定制一個分布在多個類中的行為,而又不想生成太多的子類
(注:當系統中出現多對多交互復雜的對象時,不要急著使用中介者模式,而要先反思你的系統在設計上是不是合理的)
二、代碼舉例
假設有兩個同事類1和2要進行交互。這個例子比較簡單,就不再詳細分析了。但你可以把本例當做一個模板,然后靈活使用:
2.1、對象之間的關系用UML圖描述如下:
2.2、Java代碼如下:
同事類的抽象類:
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}
同事類1:
public class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}public void send(String message) {this.mediator.send(message, this);}public void notify(String message) {System.out.println("同事1收到信息:" + message);}
}
同事類2:
public class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}public void send(String message) {this.mediator.send(message, this);}public void notify(String message) {System.out.println("同事2收到信息:" + message);}
}
中介者的抽象類:
abstract class Mediator {public abstract void send(String message, Colleague colleague);
}
具體的中介者的類:
public class ConcreteMediator extends Mediator {private ConcreteColleague1 colleague1;private ConcreteColleague2 colleague2;public void setColleague1(ConcreteColleague1 colleague1) {this.colleague1 = colleague1;}public void setColleague2(ConcreteColleague2 colleague2) {this.colleague2 = colleague2;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == this.colleague1){this.colleague2.notify(message);} else{this.colleague1.notify(message);}}
}
主程序(發起請求的類):
public class Main {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.send("你好嗎?");colleague2.send("我很好。");}
}
這里就不再舉例了,可以把上面的Java例子復制到你本地,運行main函數試一下加深理解。這些代碼都是我自己學習的時候根據一些教材手敲的,不存在bug可以直接運行。
如果覺得本文還不錯,就請點個贊給作者一點鼓勵吧!如果有建議,也請評論指教和討論!