Java 設計模式之中介者模式,java設計模式中介

來源:互聯網
上載者:User

Java 設計模式之中介者模式,java設計模式中介
本文繼續23種設計模式系列之中介者模式。

定義用一個中介者對象封裝一系列的對象互動,中介者使各對象不需要顯示地相互作用,從而使耦合鬆散,而且可以獨立地改變它們之間的互動。
角色抽象中介者:定義好同事類對象到中介者對象的介面,用於各個同事類之間的通訊。一般包括一個或幾個抽象的事件方法,並由子類去實現。中介者實作類別:從抽象中介者繼承而來,實現抽象中介者中定義的事件方法。從一個同事類接收訊息,然後通過訊息影響其他同時類。同事類:如果一個對象會影響其他的對象,同時也會被其他對象影響,那麼這兩個對象稱為同事類。在類圖中,同事類只有一個,這其實是現實的省略,在實際應用中,同事類一般由多個組成,他們之間相互影響,相互依賴。同事類越多,關係越複雜。並且,同事類也可以表現為繼承了同一個抽象類別的一組實現組成。在中介者模式中,同事類之間必須通過中介者才能進行訊息傳遞。
適用情況

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

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


應用

我們使用一個例子來說明一下什麼是同事類:有兩個類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());                }  } 

雖然代碼比較長,但是還是比較容易理解的,其實就是把原來處理對象關係的代碼重新封裝到一個中介類中,通過這個中介類來處理對象間的關係。


優點

適當地使用中介者模式可以避免同事類之間的過度耦合,使得各同事類之間可以相對獨立地使用。

使用中介者模式可以將對象間一對多的關聯轉變為一對一的關聯,使對象間的關係易於理解和維護。

使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用。


總結

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

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

更多設計模式:23種設計模式系列

作者:jason0539

部落格:http://blog.csdn.net/jason0539(轉載請說明出處)

推薦掃碼關注公眾號,看點不一樣的東西


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.