<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        My Github

      設計模式的征途—22.中介者(Mediator)模式

      我們都用過QQ,它有兩種聊天方式:一是私聊,二是群聊。使用QQ群,一個用戶就可以向多個用戶發送相同的信息和文件,從而無需一一發送,節省大量時間。通過引入群的機制,極大地減少系統中用戶之間的兩兩通信,用戶與用戶之間的聯系可以通過群的機制來實現。

      在有些軟件中,某些類/對象之間的相互調用關系錯綜復雜,類似于QQ用戶之間的關系,此時,特別需要一個類似“QQ群”一樣的中間類來協調這些類/對象之間的復雜關系,以降低系統的耦合度。因此,一個設計模式因此誕生,它就是中介者模式。

      中介者模式(Mediator) 學習難度:★★★☆☆ 使用頻率:★★☆☆☆

      一、客戶信息管理模塊的初始設計

      1.1 需求背景

      Background:M公司欲開發一套CRM系統,其中包含一個客戶信息管理模塊,所涉及的“客戶信息管理窗口”界面效果圖如下圖所示:

      M公司開發人員通過分析發現,在上圖中,界面組件之間存在較為復雜的交互關系:如果刪除一個客戶,則將從客戶列表中刪掉對應的項,客戶選擇組合框中客戶名稱也稱將減少一個;如果增加一個客戶信息,則客戶列表中將增加一個客戶,且組合框中也將增加一項。  

      1.2 初始設計

        M公司開發人員針對組件之間的交互關系進行了分析,發現:

        (1)當用戶單擊“增加”、“刪除”、“修改”或“查詢”時,界面左側的“客戶選擇組合框”、“客戶列表”以及界面中的文本框將產生響應。

        (2)當用戶通過”客戶選擇組合框“選中某個客戶姓名時,”客戶列表“和文本框將產生響應。

        (3)當用戶通過“客戶列表”選中某個客戶姓名時,“客戶選擇組合框”和文本框將產生響應。

        根據交互關系,開發人員繪制了如下圖所示的初始類圖。

        不難發現,上述設計存在以下問題:

        (1)系統結構負責且耦合度高 => 復雜的網狀結構,OMG!

        (2)組件的可重用性差 =>  由于每一個組件和其他組件之間都具有很強的關聯,很難重用!

        (3)系統的擴展性差 => 如果在上述系統中增加一個新的組件類,必須修改與之交互的各個組件源代碼!

      二、中介者模式概述

      2.1 中介者模式簡介

        如果在一個系統中對象之間存在多對多的相互關系,可以將對象之間的一些交互行為從各個對象中分離出來,并集中封裝在一個中介者對象中,并由該中介者進行統一協調,這樣對象之間多對多的復雜關系就轉化為了相對簡單的一對多關系。通過引入中介者來簡化對象之間的復雜關系,它是迪米特法則的一個典型應用。

      中介者(Mediator)模式:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以相對獨立地改變它們之間的交互。中介者模式又稱為調停模式,它是一種對象行為型模式。  

      2.2 中介者模式結構

        在中介者模式中,引入了用于協調其他對象/類之間的相互調用的中介者類,為了讓系統具有更好的靈活性和可擴展性,通常還提供了抽象中介者,其結構圖如下圖所示:

        中介者模式結構圖中主要包含以下4個角色:

        (1)Mediator(抽象中介者):它定義了一個接口,該接口用于與各同事對象之間進行通信。

        (2)ConcreteMediator(具體中介者):它實現了接口,通過協調各個同事對象來實現協作行為,維持了各個同事對象的引用。

        (3)Colleague(抽象同事類):它定義了各個同事類公有的方法,并聲明了一些抽象方法來供子類實現,同時維持了一個對抽象中介者類的引用,其子類可以通過該引用來與中介者通信。

        (4)ConcreteColleague(具體同事類):抽象同事類的子類,每一個同事對象需要和其他對象通信時,都需要先與中介者對象通信,通過中介者來間接完成與其他同事類的通信。

      三、客戶信息管理模塊的重構實現

      3.1 重構后的設計結構

        M公司開發人員借助中介者模式來重新設計結構如下圖所示:

        在具體實現時,為了確保系統有更好的靈活性和可擴展性,需要定義抽象中介者和抽象組件類,其中抽象組件類是所有具體組件類的公共父類,完整類圖如下圖所示:

        其中,Component充當抽象同事類,Button,List,ComboBox和TextBox充當具體同事類,Mediator充當抽象中介者類,ConcreteMediator充當具體中介類。在ConcreteMediator中維持了對具體同事對象的引用,為了簡化ConcreteMediator類的代碼,在其中只定義了一個Button對象和TextBox對象。

      3.2 重構后的代碼實現

        (1)抽象中介者:Mediator

          /// <summary>
          /// 抽象中介者
          /// </summary>
          public abstract class Mediator
          {
              public abstract void ComponenetChanged(Component c);
          }

        (2)具體中介者:ConcreteMediator

          /// <summary>
          /// 具體中介者
          /// </summary>
          public class ConcreteMediator : Mediator
          {
              // 維持對各個同事對象的引用
              public Button addButton;
              public List list;
              public TextBox userNameTextBox;
              public ComboBox cb;
      
              // 封裝同事對象之間的交互
              public override void ComponenetChanged(Component c)
              {
                  // 單擊按鈕
                  if (c == addButton)
                  {
                      Console.WriteLine("-- 單擊增加按鈕 --");
                      list.Update();
                      cb.Update();
                      userNameTextBox.Update();
                  }
                  // 從列表框選擇客戶
                  else if (c == list)
                  {
                      Console.WriteLine("-- 從列表框選擇客戶 --");
                      cb.Select();
                      userNameTextBox.SetText();
                  }
                  // 從組合框選擇客戶
                  else if (c == cb)
                  {
                      Console.WriteLine("-- 從組合框選擇客戶 --");
                      cb.Select();
                      userNameTextBox.SetText();
                  }
              }
          }

        (3)抽象同事類:Colleague

          /// <summary>
          /// 抽象同事類:抽象組件
          /// </summary>
          public abstract class Component
          {
              protected Mediator mediator;
      
              public void SetMediator(Mediator mediator)
              {
                  this.mediator = mediator;
              }
      
              // 轉發調用
              public void Changed()
              {
                  mediator.ComponenetChanged(this);
              }
      
              public abstract void Update();
          }

        (4)具體同事類:ConcreteColleague

          /// <summary>
          /// 具體同事類:按鈕組件
          /// </summary>
          public class Button : Component
          {
              public override void Update()
              {
                  // 按鈕不產生響應
              }
          }
      
          /// <summary>
          /// 具體同事類:列表框組件
          /// </summary>
          public class List : Component
          {
              public override void Update()
              {
                  Console.WriteLine("列表框增加一項:張無忌");
              }
      
              public void Select()
              {
                  Console.WriteLine("列表框選中項:小龍女");
              }
          }
      
          /// <summary>
          /// 具體同事類:組合框組件
          /// </summary>
          public class ComboBox : Component
          {
              public override void Update()
              {
                  Console.WriteLine("組合框增加一項:張無忌");
              }
      
              public void Select()
              {
                  Console.WriteLine("組合框選中項:小龍女");
              }
          }
      
          /// <summary>
          /// 具體同事類:文本框組件
          /// </summary>
          public class TextBox : Component
          {
              public override void Update()
              {
                  Console.WriteLine("客戶信息增加成功后文本框清空");
              }
      
              public void SetText()
              {
                  Console.WriteLine("文本框顯示:小龍女");
              }
          }
      
          /// <summary>
          /// 具體同事類:標簽組件
          /// </summary>
          public class Label : Component
          {
              public override void Update()
              {
                  Console.WriteLine("文本標簽內容改變,客戶信息總數量加1");
              }
          }

        (5)客戶端測試:

          public class Program
          {
              public static void Main()
              {
                  // Step1.定義中介者對象
                  ConcreteMediator mediator = new ConcreteMediator();
      
                  // Step2.定義同事對象
                  Button addButton = new Button();
                  List list = new List();
                  ComboBox cb = new ComboBox();
                  TextBox userNameTextBox = new TextBox();
      
                  addButton.SetMediator(mediator);
                  list.SetMediator(mediator);
                  cb.SetMediator(mediator);
                  userNameTextBox.SetMediator(mediator);
      
                  mediator.addButton = addButton;
                  mediator.list = list;
                  mediator.cb = cb;
                  mediator.userNameTextBox = userNameTextBox;
      
                  // Step3.點擊增加按鈕
                  addButton.Changed();
      
                  Console.WriteLine("---------------------------------------------");
      
                  // Step4.從列表框選擇客戶
                  list.Changed();
              }
          }

        調試運行后的結果如下所示:

        

      四、中介者模式小結

      4.1 主要優點

        (1)簡化了對象之間的交互,它用中介者和同事的一對多交互替代了原來同事之間的多對多交互

        (2)將各同事對象解耦,可以獨立地改變和復用每個同事和中介者,增加新的中介和同事很方便,符合開閉原則。

        (3)可以減少大量同事子類的生成,改變同事行為只需要生成新的中介者子類即可。

      4.2 主要缺點

        具體中介者子類中包含了大量的同事之間的交互細節,可能會導致具體中介者類非常復雜,使得系統難以維護。

      4.3 應用場景

        (1)系統中對象之間存在復雜的引用關系 => 系統結構混亂且難以理解

        (2)一個對象由于引用了其他很多對象并且直接和這些對象通信 => 難以復用該對象

        (3)想要通過一個中間類來封裝多個類的行為又不想生成太多子類 => 引入中介者即可實現

      參考資料

        DesignPattern

        (1)劉偉,《設計模式的藝術—軟件開發人員內功修煉之道》

       

      posted @ 2017-09-11 00:04  EdisonZhou  閱讀(2323)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 免费国产一区二区不卡| 日韩激情无码免费毛片| 美日韩av一区二区三区| 国产成人精品一区二区三区无码| 四虎国产精品久久免费精品| 国产成人综合色就色综合| 国产不卡一区不卡二区| 图片区 小说区 区 亚洲五月| 日韩中文免费一区二区| 四虎永久精品在线视频| 色欲aⅴ亚洲情无码av蜜桃| 国产偷国产偷亚洲高清人| 亚洲国产精品日韩在线| 亚洲二区中文字幕在线| 亚洲无人区一码二码三码| 男女真人国产牲交a做片野外| 热久在线免费观看视频| 久本草在线中文字幕亚洲| 国产精品一区二区三区性色| 国内精品久久久久影院网站| 99中文字幕国产精品| 久久精品国产亚洲av久| 中文字幕人妻日韩精品| 日韩美女亚洲性一区二区| 中文字幕日韩有码av| 中文字幕国产精品二区| 国产精品无码无片在线观看3d| 国产97人人超碰CAO蜜芽PROM| 久久精品av国产一区二区| 永久免费无码网站在线观看| 亚洲小说乱欧美另类| 熟妇的奶头又大又长奶水视频| 嫩草成人AV影院在线观看| 无线乱码一二三区免费看| 亚洲国产精品高清久久久| 欧美 亚洲 另类 丝袜 自拍 动漫| 临安市| 一本一道av无码中文字幕麻豆| 国产精品久久久久影院色 | 亚洲精品成人片在线观看精品字幕| 欧美不卡无线在线一二三区观|