<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 協調多個對象之間的交互——中介者模式(二) 20.2 中介者模式概述 如果在一個系統中對象之間的聯系呈現為網狀結構,如圖20-4所示。對象之間存在大量的多對多聯系,將導致系統非常復雜,這些對象既會影響別的對象,也會被別的對象所影響,這些對象稱為同事對象,它們之間通過彼此的相互作用實現系統的行為。在網狀結構中,幾乎每個對象都需要與其他對象發生相互作用,而這種相互作用表現為一個對象與另外一個對象的直接耦合,這將導致一個過度耦合的系統。 ![](http://img.my.csdn.net/uploads/201301/08/1357651860_8819.jpg) 圖20-4 對象之間存在復雜關系的網狀結構 中介者模式可以使對象之間的關系數量急劇減少,通過引入中介者對象,可以將系統的網狀結構變成以中介者為中心的星形結構,如圖20-5所示。在這個星形結構中,同事對象不再直接與另一個對象聯系,它通過中介者對象與另一個對象發生相互作用。中介者對象的存在保證了對象結構上的穩定,也就是說,系統的結構不會因為新對象的引入帶來大量的修改工作。 ![](http://img.my.csdn.net/uploads/201301/08/1357651865_7741.jpg) 圖20-5 引入中介者對象的星型結構 如果在一個系統中對象之間存在多對多的相互關系,我們可以將對象之間的一些交互行為從各個對象中分離出來,并集中封裝在一個中介者對象中,并由該中介者進行統一協調,這樣對象之間多對多的復雜關系就轉化為相對簡單的一對多關系。通過引入中介者來簡化對象之間的復雜交互,中介者模式是“迪米特法則”的一個典型應用。 中介者模式定義如下: > 中介者模式(Mediator Pattern):用一個中介對象(中介者)來封裝一系列的對象交互,中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。中介者模式又稱為調停者模式,它是一種對象行為型模式。 在中介者模式中,我們引入了用于協調其他對象/類之間相互調用的中介者類,為了讓系統具有更好的靈活性和可擴展性,通常還提供了抽象中介者,其結構圖如圖20-6所示: ![](http://img.my.csdn.net/uploads/201301/08/1357651874_7064.jpg) 圖20-6 中介者模式結構圖 在中介者模式結構圖中包含如下幾個角色: ● Mediator(抽象中介者):它定義一個接口,該接口用于與各同事對象之間進行通信。 ● ConcreteMediator(具體中介者):它是抽象中介者的子類,通過協調各個同事對象來實現協作行為,它維持了對各個同事對象的引用。 ● Colleague(抽象同事類):它定義各個同事類公有的方法,并聲明了一些抽象方法來供子類實現,同時它維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信。 ● ConcreteColleague(具體同事類):它是抽象同事類的子類;每一個同事對象在需要和其他同事對象通信時,先與中介者通信,通過中介者來間接完成與其他同事類的通信;在具體同事類中實現了在抽象同事類中聲明的抽象方法。 中介者模式的核心在于中介者類的引入,在中介者模式中,中介者類承擔了兩方面的職責: (1) 中轉作用(結構性):通過中介者提供的中轉作用,各個同事對象就不再需要顯式引用其他同事,當需要和其他同事進行通信時,可通過中介者來實現間接調用。該中轉作用屬于中介者在結構上的支持。 (2) 協調作用(行為性):中介者可以更進一步的對同事之間的關系進行封裝,同事可以一致的和中介者進行交互,而不需要指明中介者需要具體怎么做,中介者根據封裝在自身內部的協調邏輯,對同事的請求進行進一步處理,將同事成員之間的關系行為進行分離和封裝。該協調作用屬于中介者在行為上的支持。 在中介者模式中,典型的抽象中介者類代碼如下所示: ``` abstract class Mediator { protected ArrayList<Colleague> colleagues; //用于存儲同事對象 //注冊方法,用于增加同事對象 public void register(Colleague colleague) { colleagues.add(colleague); } //聲明抽象的業務方法 public abstract void operation(); } 在抽象中介者中可以定義一個同事類的集合,用于存儲同事對象并提供注冊方法,同時聲明了具體中介者類所具有的方法。在具體中介者類中將實現這些抽象方法,典型的具體中介者類代碼如下所示: [java] view plain copy class ConcreteMediator extends Mediator { //實現業務方法,封裝同事之間的調用 public void operation() { ...... ((Colleague)(colleagues.get(0))).method1(); //通過中介者調用同事類的方法 ...... } } ``` 在具體中介者類中將調用同事類的方法,調用時可以增加一些自己的業務代碼對調用進行控制。 在抽象同事類中維持了一個抽象中介者的引用,用于調用中介者的方法,典型的抽象同事類代碼如下所示: ``` abstract class Colleague { protected Mediator mediator; //維持一個抽象中介者的引用 public Colleague(Mediator mediator) { this.mediator=mediator; } public abstract void method1(); //聲明自身方法,處理自己的行為 //定義依賴方法,與中介者進行通信 public void method2() { mediator.operation(); } } ``` 在抽象同事類中聲明了同事類的抽象方法,而在具體同事類中將實現這些方法,典型的具體同事類代碼如下所示: ``` class ConcreteColleague extends Colleague { public ConcreteColleague(Mediator mediator) { super(mediator); } //實現自身方法 public void method1() { ...... } } ``` 在具體同事類ConcreteColleague中實現了在抽象同事類中聲明的方法,其中方法method1()是同事類的自身方法(Self-Method),用于處理自己的行為,而方法method2()是依賴方法(Depend-Method),用于調用在中介者中定義的方法,依賴中介者來完成相應的行為,例如調用另一個同事類的相關方法。 思考 如何理解同事類中的自身方法與依賴方法?
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看