<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 協調多個對象之間的交互——中介者模式(四) 20.4 中介者與同事類的擴展 Sunny軟件公司CRM系統的客戶對“客戶信息管理窗口”提出了一個修改意見:要求在窗口的下端能夠及時顯示當前系統中客戶信息的總數。修改之后的界面如圖20-9所示: ![](http://img.my.csdn.net/uploads/201301/08/1357653249_4096.jpg) 圖20-9 修改之后的“客戶信息管理窗口”界面圖 從圖20-9中我們不難發現,可以通過增加一個文本標簽(Label)來顯示客戶信息總數,而且當用戶點擊“增加”按鈕或者“刪除”按鈕時,將改變文本標簽的內容。 由于使用了中介者模式,在原有系統中增加新的組件(即新的同事類)將變得很容易,我們至少有如下兩種解決方案: 【解決方案一】增加一個界面組件類Label,修改原有的具體中介者類ConcreteMediator,增加一個對Label對象的引用,然后修改componentChanged()方法中其他相關組件對象的業務處理代碼,原有組件類無須任何修改,客戶端代碼也需針對新增組件Label進行適當修改。 【解決方案二】與方案一相同,首先增加一個Label類,但不修改原有具體中介者類ConcreteMediator的代碼,而是增加一個ConcreteMediator的子類SubConcreteMediator來實現對Label對象的引用,然后在新增的中介者類SubConcreteMediator中通過覆蓋componentChanged()方法來實現所有組件(包括新增Label組件)之間的交互,同樣,原有組件類無須做任何修改,客戶端代碼需少許修改。 引入Label之后“客戶信息管理窗口”類結構示意圖如圖20-10所示: ![](http://img.my.csdn.net/uploads/201301/08/1357653254_7868.jpg) 圖20-10 增加Label組件類后的“客戶信息管理窗口”結構示意圖 由于【解決方案二】無須修改ConcreteMediator類,更符合“開閉原則”,因此我們選擇該解決方案來對新增Label類進行處理,對應的完整類圖如圖20-11所示: ![](http://img.my.csdn.net/uploads/201301/08/1357653264_4751.jpg) 圖20-11 修改之后的“客戶信息管理窗口”結構圖 在圖20-11中,新增了具體同事類Label和具體中介者類SubConcreteMediator,代碼如下所示: ``` //文本標簽類:具體同事類 class Label extends Component { public void update() { System.out.println("文本標簽內容改變,客戶信息總數加1。"); } } //新增具體中介者類 class SubConcreteMediator extends ConcreteMediator { //增加對Label對象的引用 public Label label; public void componentChanged(Component c) { //單擊按鈕 if(c == addButton) { System.out.println("--單擊增加按鈕--"); list.update(); cb.update(); userNameTextBox.update(); label.update(); //文本標簽更新 } //從列表框選擇客戶 else if(c == list) { System.out.println("--從列表框選擇客戶--"); cb.select(); userNameTextBox.setText(); } //從組合框選擇客戶 else if(c == cb) { System.out.println("--從組合框選擇客戶--"); cb.select(); userNameTextBox.setText(); } } } ``` 修改客戶端測試代碼: ``` class Client { public static void main(String args[]) { //用新增具體中介者定義中介者對象 SubConcreteMediator mediator; mediator = new SubConcreteMediator(); Button addBT = new Button(); List list = new List(); ComboBox cb = new ComboBox(); TextBox userNameTB = new TextBox(); Label label = new Label(); addBT.setMediator(mediator); list.setMediator(mediator); cb.setMediator(mediator); userNameTB.setMediator(mediator); label.setMediator(mediator); mediator.addButton = addBT; mediator.list = list; mediator.cb = cb; mediator.userNameTextBox = userNameTB; mediator.label = label; addBT.changed(); System.out.println("-----------------------------"); list.changed(); } } ``` 編譯并運行程序,輸出結果如下: ``` --單擊增加按鈕-- 列表框增加一項:張無忌。 組合框增加一項:張無忌。 客戶信息增加成功后文本框清空。 文本標簽內容改變,客戶信息總數加1。 ----------------------------- --從列表框選擇客戶-- 組合框選中項:小龍女。 文本框顯示:小龍女。 ``` 由于在本實例中不同的組件類(即不同的同事類)所擁有的方法并不完全相同,因此中介者類沒有針對抽象同事類編程,導致在具體中介者類中需要維持對具體同事類的引用,客戶端代碼無法完全透明地對待所有同事類和中介者類。在某些情況下,如果設計得當,可以在客戶端透明地對同事類和中介者類編程,這樣系統將具有更好的靈活性和可擴展性。 思考 如果不使用中介者模式,按照圖20-3所示設計方案,增加新組件時原有系統該如何修改? 在中介者模式的實際使用過程中,如果需要引入新的具體同事類,只需要繼承抽象同事類并實現其中的方法即可,由于具體同事類之間并無直接的引用關系,因此原有所有同事類無須進行任何修改,它們與新增同事對象之間的交互可以通過修改或者增加具體中介者類來實現;如果需要在原有系統中增加新的具體中介者類,只需要繼承抽象中介者類(或已有的具體中介者類)并覆蓋其中定義的方法即可,在新的具體中介者中可以通過不同的方式來處理對象之間的交互,也可以增加對新增同事的引用和調用。在客戶端中只需要修改少許代碼(如果引入配置文件的話有時可以不修改任何代碼)就可以實現中介者的更換。
                  <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>

                              哎呀哎呀视频在线观看