搜尋
首頁Javajava教程Java設計模式之關於中介者模式詳解(圖)

Java設計模式之關於中介者模式詳解(圖)

Aug 11, 2017 am 10:03 AM
java模式設計模式

這篇文章主要為大家詳細介紹了設計模式之中介者模式的相關資料,具有一定的參考價值,有興趣的小夥伴們可以參考一下

定義:用一個中介者物件封裝一系列的物件交互,中介者使各物件不需要顯示地相互作用,從而使耦合鬆散,而且可以獨立地改變它們之間的交互。

類型:行為類別模式

類別圖:

20162593206564.jpg (526×202)

中介者模式的結構

中介者模式又稱為調停者模式,從類別圖中看,共分為3部分:

抽像中介者:定義好同事類物件到中介者物件的接口,用於各個同事類別之間的溝通。一般包括一個或幾個抽象的事件方法,並由子類別去實作。

中介者實作類別:從抽像中介者繼承而來,實作抽像中介者中定義的事件方法。從一個同事類別接收訊息,然後透過訊息影響其他同時類別。

同事類別:如果一個物件會影響其他的對象,同時也會被其他物件影響,那麼這兩個物件稱為同事類別。在類別圖中,同事類別只有一個,這其實是現實的省略,在實際應用中,同事類別一般由多個組成,他們之間相互影響,相互依賴。同事類越多,關係越複雜。並且,同事類別也可以表現為繼承了同一個抽象類別的一組實作組成。在中介者模式中,同事類之間必須透過中介者才能進行訊息傳遞。

為什麼要使用中介者模式

一般來說,同事類別之間的關係是比較複雜的,多個同事類別之間互相關聯時,他們之間的關係會呈現為複雜的網狀結構,這是一種過度耦合的架構,即不利於類的複用,也不穩定。例如在下圖中,有六個同事類別對象,假如對象1發生變化,那麼將會有4個對象受到影響。如果物件2發生變化,那麼將會有5個物件受到影響。也就是說,同事類別之間直接關聯的設計是不好的。

20162593302973.jpg (431×252)20162593327585.jpg (419×251)

如果引入中介者模式,那麼同事類別之間的關係將變成星型結構,從圖中可以看到,任何一個類的變動,只會影響的類本身,以及中介者,這樣就減少了系統的耦合。一個好的設計,必定不會把所有的物件關係處理邏輯封裝在本類中,而是使用一個專門的類別來管理那些不屬於自己的行為。

20162593346671.jpg (427×357)

我們使用一個例子來說明一下什麼是同事類別:有兩個類別A和B,類別中各有一個數字,並且要保證類別B中的數字永遠是類A中數字的100倍。也就是說,當修改類A的數時,將這個數字乘以100賦給類B,而修改類B時,要將數除以100賦給類A。類A類B互相影響,就稱為同事類。程式碼如下:


abstract class AbstractColleague { 
  protected int number; 
 
  public int getNumber() { 
    return number; 
  } 
 
  public void setNumber(int number){ 
    this.number = number; 
  } 
  //抽象方法,修改数字时同时修改关联对象 
  public abstract void setNumber(int number, AbstractColleague coll); 
} 
 
class ColleagueA extends AbstractColleague{ 
  public void setNumber(int number, AbstractColleague coll) { 
    this.number = number; 
    coll.setNumber(number*100); 
  } 
} 
 
class ColleagueB extends AbstractColleague{ 
   
  public void setNumber(int number, AbstractColleague coll) { 
    this.number = number; 
    coll.setNumber(number/100); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
 
    AbstractColleague collA = new ColleagueA(); 
    AbstractColleague collB = new ColleagueB(); 
     
   System.out.println("==========设置A影响B=========="); 
    collA.setNumber(1288, collB); 
    System.out.println("collA的number值:"+collA.getNumber()); 
    System.out.println("collB的number值:"+collB.getNumber()); 
 
    System.out.println("==========设置B影响A=========="); 
    collB.setNumber(87635, collA); 
    System.out.println("collB的number值:"+collB.getNumber()); 
    System.out.println("collA的number值:"+collA.getNumber()); 
  } 
}

上面的程式碼中,類別A類B透過直接的關聯發生關係,假如我們要使用中介者模式,類別A類B之間則不可以直接關聯,他們之間必須透過一個中介者來達到關聯的目的。


abstract class AbstractColleague { 
  protected int number; 
 
  public int getNumber() { 
    return number; 
  } 
 
  public void setNumber(int number){ 
    this.number = number; 
  } 
  //注意这里的参数不再是同事类,而是一个中介者 
  public abstract void setNumber(int number, AbstractMediator am); 
} 
 
class ColleagueA extends AbstractColleague{ 
 
  public void setNumber(int number, AbstractMediator am) { 
    this.number = number; 
    am.AaffectB(); 
  } 
} 
 
class ColleagueB extends AbstractColleague{ 
 
  @Override 
  public void setNumber(int number, AbstractMediator am) { 
    this.number = number; 
    am.BaffectA(); 
  } 
} 
 
abstract class AbstractMediator { 
  protected AbstractColleague A; 
  protected AbstractColleague B; 
   
  public AbstractMediator(AbstractColleague a, AbstractColleague b) { 
    A = a; 
    B = b; 
  } 
 
  public abstract void AaffectB(); 
   
  public abstract void BaffectA(); 
 
} 
class Mediator extends AbstractMediator { 
 
  public Mediator(AbstractColleague a, AbstractColleague b) { 
    super(a, b); 
  } 
 
  //处理A对B的影响 
  public void AaffectB() { 
    int number = A.getNumber(); 。
    B.setNumber(number*100); 
  } 
 
  //处理B对A的影响 
  public void BaffectA() { 
    int number = B.getNumber(); 
    A.setNumber(number/100); 
  } 
} 
 
public class Client { 
  public static void main(String[] args){ 
    AbstractColleague collA = new ColleagueA(); 
    AbstractColleague collB = new ColleagueB(); 
     
    AbstractMediator am = new Mediator(collA, collB); 
     
    System.out.println("==========通过设置A影响B=========="); 
    collA.setNumber(1000, am); 
    System.out.println("collA的number值为:"+collA.getNumber()); 
    System.out.println("collB的number值为A的10倍:"+collB.getNumber()); 
 
    System.out.println("==========通过设置B影响A=========="); 
    collB.setNumber(1000, am); 
    System.out.println("collB的number值为:"+collB.getNumber()); 
    System.out.println("collA的number值为B的0.1倍:"+collA.getNumber()); 
     
  } 
}

        雖然程式碼比較長,但還是比較容易理解的,其實就是重新封裝原來處理物件關係的程式碼到一個中介類別中,透過這個中介類別來處理物件間的關係。

中介者模式的優點

適當地使用中介者模式可以避免同事類別之間的過度耦合,使得各同事類之間可以相對獨立使用。
使用中介者模式可以將物件間一對多的關聯轉變為一對一的關聯,使物件間的關係易於理解和維護。
使用中介者模式可以將物件的行為和協作進行抽象,能夠比較靈活的處理物件間的互動。

適用場景

#

       在物件導向程式設計中,一個類別必然會與其他的類別發生依賴關係,而完全獨立的類別是沒有意義的。一個類別同時依賴多個類別的情況也相當普遍,既然存在這樣的情況,說明,一對多的依賴關係有它的合理性,適當的使用中介者模式可以使原本凌亂的對象關係清晰,但是如果濫用,則可能會帶來反的效果。一般來說,只有對於那種同事類之間是網狀結構的關係,才會考慮使用中介者模式。可以將網狀結構變成星狀結構,使同事類之間的關係變的清晰一些。

       中介者模式是較常用的模式,也是較容易被濫用的模式。對於大多數的情況,同事類之間的關係不會複雜到混亂不堪的網狀結構,因此,大多數情況下,將對象間的依賴關係封裝的同事類內部就可以的,沒有必要非引入中介者模式。濫用中介者模式,只會讓事情變的更複雜。

以上是Java設計模式之關於中介者模式詳解(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。