大话设计模式—中介者模式
中介者模式(Mediator Pattern)是用來降低多個對象和類之間的通信復雜性。這種模式提供了一個中介類,該類通常處理不同類之間的通信,并支持松耦合,使代碼易于維護。中介者模式屬于行為型模式。
引言:
盡管一個系統分割成許多對象通常可以增加其可復用性,但是對象間相互連接次數的增加又會降低其可復用性;大量的連接使得一個對象不可能在沒有其他對象的支持下工作,系統表現為一個不可分割的整體,所以,對系統的行為進行任何較大的改動就十分困難了。
要解決這樣的問題,我們可以使用 迪米特原則 ,如果兩個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果需要相互調用,可以通過第三方來轉發。
通過中介者對象,可以將系統的網狀結構變成以中介者為中心的星型結構,每個具體對象不再通過直接的聯系與另一個具體對象進行通信,而是通過中介者對象。中介者對象的設計使得系統的結構不會因為新對象的引入而造成大量的修改工作。如下圖聯合國與各個國家的關系就是一個很貼切的例子:
大話設計模式中程杰老師給出的定義是:
中介者模式,用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示的相互引用,從而使其耦合松散,而且可以獨立的改變他們之間的交互。
代碼實例:
抽象中介者
public abstract class Mediator{/*** 定義一個抽象的發送消息方法* 功能:得到同事對象和發送消息*/public abstract void Send(String message,Colleague colleague);}抽象同事類
public abstract classColleague{protected Mediator mediator;//構造方法,得到中介者對象public Colleague(){this.mediator = mediator;} }中介者實現類
public class ConcreteMediator implements Mediator{private ConcreteMediatorA colleagueA;private ConcreteMediaorB colleagueB;//setter and getter//重寫發送消息的方法,根據具體發送消息的對象去通知接收消息的對象public void send(String message,Colleague colleague){if(colleague == colleagueA){colleagueB.notify(message);}colleagueA.notify(message);} }同事對象實現類A
public class ConcreteColleagueA implements Colleague{public ConcreteColleagueA(Mediator mediator){this.mediator = mediator;}public void send(String message){//消息是通過中介者發送出去的mediator.send(message,this.concreteColleagueA);}public void notify(String message){Systen.out.println("A同事收到消息:" + message);} }同事對象實現類B
public class ConcreteColleagueB implements Colleague{public ConcreteColleagueB(Mediator mediator){this.mediator = mediator;}public void send(String message){//消息是通過中介者發送出去的mediator.send(message,this.concreteColleagueB);}public void notify(String message){Systen.out.println("B同事收到消息:" + message);} }測試類
public static void main(String[] args){ConcreteMediator mediator = new ConcreteMediator();//讓兩個具體同事類對象認識中介者對象ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);mediator.colleagueA = colleagueA;mediator.colleagueB = colleagueB;colleagueA.send("hi,nice to meet you!");colleagueB.send("nice to meet you too!"); }運行結果:
B同事收到消息:hi,nice to meet you! A同事收到消息:nice to meet you too!優點:
1、降低了類的復雜度,將一對多轉化成了一對一。
2、各個類之間的解耦。
3、符合迪米特原則。
缺點:中介者會龐大,變得復雜難以維護。
使用場景:
1、系統中對象之間存在比較復雜的引用關系,導致它們之間的依賴關系結構混亂而且難以復用該對象。
2、想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類。
注意事項:不應當在職責混亂的時候使用。
中介者模式的優點來自于集中控制,其缺點也是(中介者對象必須知道所有的同事對象),使用時要考慮清楚。
總結
以上是生活随笔為你收集整理的大话设计模式—中介者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浏览器兼容性问题汇总及解决方案
- 下一篇: 大话设计模式—策略模式