posts - 297,  comments - 1618,  trackbacks - 0

           

                  調停者模式(Mediator) 屬于對象的行為模式
          1. 定義
               調停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。
          2. 使用的原因
                
          當對象之間的交互操作很多,且每個對象的行為操作都依賴彼此時,為防止
          在修改一個對象的行為時,同時涉及到修改很多其他對象的行為,可采用調停者模式,來解決緊耦合問題.
               該模式將對象之間的多對多關系變成一對多關系,調停者對象將系統從網狀
          結構變成以調停者為中心的星形結構,達到降低系統的復雜性,提高可擴展性的作用.
          3. 適用的情況舉例
              eg1. WTO組織:它是一個協調組織,它將各貿易區自行進行的相互協調的強耦合變成了松散合;
              eg2. 4個MM打麻將,相互之間誰應該給誰多少錢算不清楚了,某人擔任調停者,各MM按照各自的籌碼數算錢,賺了錢的從調停者這里拿,賠了錢的也付給調停者;
              eg3. 租賃中介:很多人有出租房子的需求,也有不少人需要租房,租賃中介在其中擔任了調停者的角色,  疏通了兩者之間的復雜關系,也方便了兩者。     
          4. 類圖結構及說明
            1)示意性類圖如下所示:
              
             2)類說明
              i)Mediator:抽象調停者角色,它定義出同事對象到調停者對象得接口,這個角色一般由Java抽象類實現
              ii)ConcreteMediator:具體調停者模式,從抽象調停者繼承,實現了超類所聲明的事件方法,它從具體同事對象接收消息,向具體同事對象發出命令.
              iii)Colleague:抽象同事類角色,它定義了調停者同事對象的接口,它只知道調停者而不知道其余同事對象.
              iv)colleague1、colleague2:具體同事類角色,從抽象同事類繼承而來,每個具體同事類都知道本身在小范圍內的行為,而不知道它在大范圍內的目的.
          5. 使用舉例
              1)需求
              有次去佛山開發一個項目時,我們項目組要去現場開發,開發時間為一個月,PM打算到附近租個房子,但因對佛山不熟悉,而且因為只租一個月,很多房東都不愿意租,所以找個合適的房子真是難上加難。
              2)分析
              很多的房東需要出租自己的房子,而有很多的房客需要租房子,房屋需求和供給之間存在著錯綜復雜的關系,為解決這種錯綜復雜的關系,我們考慮運用弄個“中介者”出來,這樣房東和房客都只需要跟這個中介打交道,方便了兩者,嘻嘻,當時我們找了個房屋租賃中介,在短期內以2800元的價格租了個套間,當然還付出了不少的中介費:)
              3)代碼參考實現
                  i)抽象同事類
               

          public abstract class Colleague {
              privat Mediator mediator;

              
          /**
               * 構造函數
               
          */

              
          public Colleague(Mediator mediator) {
                  
          this.mediator = mediator;
              }


              
          /**
               * 獲得調停者對象
               
          */

                  
          public Mediator getMediator() {
                  
          return mediator;
              }


                  
          /**
               * 具體行為,由子類實現
               
          */

              
          public abstract void action();
          }

                 ii) 具體同事類
                   a) 房東類
          public class Landlord extends Colleague {
              
          public Landlord(Mediator mediator) {
                  
          super(mediator);
              }


              
          /**
               * 房東具體的行為方法,例如,將房間資料交給中介等
               
          */

              
          public void action() {
                  System.out.println(
          "進行將房間資料交給中介等操作,

          省略
          ");
              }

          }
                  b) 房客
          public class Lodger extends Colleague {
              
          public Lodger(Mediator mediator) {
                  
          super(mediator);
              }


              
          /**
               * 房客具體的行為方法,例如,將租房需求交給中介等
               
          */

              
          public void action {
                  System.out.println(
          "進行將租房需求交給中介等操作,

          省略
          ");
              }

          }


               iii)抽象調停者角色
             
          public abstract class Mediator {
              
          public abstract void colleagueChanged(Colleague 

          colleage);
          }
               iv)具體調停者角色
            
          public class ConcreteMediator extends Mediator {
              
          private Landlord landlord;
              
          private Lodger lodger;

              
          public void colleagueChanged(Colleague colleague) {
                  landlord.action();
                  lodger.action();
              }


              
          /**
               * 工廠方法,創建同事對象
               
          */

              
          public void createConcreteMediator() {
                  landlord 
          = new Landlord(this);
                  lodger 
          = new Lodger(this);
              }


              
          //省略房東與房客的getter方法
          }

           參考書籍:《Java與模式》
                              《Patterns in Java》
          posted on 2007-04-14 11:24 阿蜜果 閱讀(4123) 評論(3)  編輯  收藏 所屬分類: Design Pattern


          FeedBack:
          # re: 設計模式學習筆記--調停者模式(Mediator)
          2007-04-15 09:20 | dennis
          不錯  回復  更多評論
            
          # re: 設計模式學習筆記--調停者模式(Mediator)
          2007-09-18 14:21 | paul
          同事只能意識到調停者的存在,不能意識到其他同事的存在從而對象之間的耦合性降低
          那么對象之間是如何通知那?感覺例子不完整
            回復  更多評論
            
          # re: 設計模式學習筆記--調停者模式(Mediator)
          2008-11-07 14:08 | 志武
          你的例子是錯誤的,沒有理解調停者模式的精髓。
          同事對象之間是如何協調工作的呢?你并沒有給出。  回復  更多評論
            
          <2007年4月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296388
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阳东县| 怀化市| 池州市| 获嘉县| 崇州市| 潮安县| 阳朔县| 鹰潭市| 亚东县| 全椒县| 仁怀市| 嫩江县| 隆子县| 酉阳| 凉城县| 资兴市| 丹凤县| 富川| 河间市| 侯马市| 綦江县| 海口市| 永年县| 英超| 合阳县| 于田县| 边坝县| 隆昌县| 麻江县| 许昌县| 盱眙县| 伊宁县| 惠来县| 阿克苏市| 叙永县| 信丰县| 米林县| 扎鲁特旗| 文昌市| 和平县| 静海县|