<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ivaneeo's blog

    自由的力量,自由的生活。

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

    #

    作法(Mechanics)
      • 在client class中建立一個函數,用來提供你需要的功能。
          • ==》這個函數不應該取用client class的任何特性。如果它需要一個值,把該值當作參數傳給它。
      • 以server class實體作為該函數的第一個參數。
      • 將該函數注釋為:[外加函數(foreign method),應在server class實現。]
          • ==》這么一來,將來如果有機會將外加函數搬移到server class中,你便可以輕松找出這些外加函數。
    posted @ 2005-08-31 14:21 ivaneeo 閱讀(253) | 評論 (0)編輯 收藏

    動機(Motivation)
    進行本項重構時,如果你以外加函數實現一項功能,那就是一個明確信號;這個函數原本應該在提供服務的(server) class中加以實現。

    如果你發現自己為一個server class建立了大量外加函數,或如果你發現有許多classes都需要同樣的外加函數,你就不應該再使用本項重構,而應該使用Introduce Local Extensiong(164)。
    posted @ 2005-08-31 14:15 ivaneeo 閱讀(167) | 評論 (0)編輯 收藏

    你所使用的server class需要一個額外函數,但你無法修改這個class。

    在client class中建立一個函數,并以一個server class實體作為第一引數(argument)。

    Date newStart = new Date(previousEnd.getYear(), previousEnd.getMonth(), previousEnd.getDate() + 1);
                                                     126.gif
    Date newStart = nextDay(previousEnd);

    private static Date nextDay(Date arg) {
        return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 1);
    }
    posted @ 2005-08-31 14:09 ivaneeo 閱讀(161) | 評論 (0)編輯 收藏

    范例(Examples)
    上一項重構結束時,Person將Department隱藏起來了:
    class Person...
        Department _department;
        public Person getManager() {
           return _department.getManager();
        }

    class Department...
        private Person _manager;
        public Department(Person manager) {
           _manager = manager;
        }
    為了找出某人的經理,客戶代碼可能這樣寫:
        manager = john.getManager();
    首先在Person中建立一個[受托對象(delegate)取得函數]:
        manager  = john.getDepartment.getManager();
    然后逐一處理每個委托函數。

    為方便起見,我也可能想要保留一部分委托關系(delegations)。此外我也可能希望對某些客戶隱藏委托關系,并讓另一些用戶直接使用受托對象。
    posted @ 2005-08-31 14:03 ivaneeo 閱讀(207) | 評論 (0)編輯 收藏

    作法(Mechanics)
      • 建立一個函數,用以取用delegate(受托對象)。
      • 對于每個委托函數(delegate method),在server中刪除該函數,并將[客戶對該函數的調用]替換為[對delegate(受托對象)的調用]。
      • 處理每個委托函數后,編譯、測試。
    posted @ 2005-08-31 13:54 ivaneeo 閱讀(138) | 評論 (0)編輯 收藏

    動機(Motivation)
    Hide Delegate(157)的[動機]欄,我談到了[封 裝delegated object(受托對象)]的好處。但是這層封裝也是要付出代價的,它的代價就是:每當客戶要使用delegate(受托類)的新特性時,你就必須在 server端添加一個簡單委托函數。隨著delegate的特性(功能)越來越多,這一過程會讓你痛苦不已。server完全變成了一個[中間人],此 時你就應該讓客戶直接調用delegate。
    posted @ 2005-08-31 13:51 ivaneeo 閱讀(131) | 評論 (0)編輯 收藏

    某個class做了過多的簡單委托動作(simple delegation)。

    讓客戶直接調用delegate(受托類)。

    Remove_Middle_Man.png
    posted @ 2005-08-31 13:45 ivaneeo 閱讀(174) | 評論 (0)編輯 收藏

    范例(Examples)
    本例從兩個classes開始,代表[人]的Person和代表[部門]的Department:
    class Person {
        Department _department;

        public Department getDepartment() {
           return _department;
        }
        public void setDepartment(Department arg) {
           _department = arg;
        }
    }

    class Department {
        private String _chargeCode;
        private Person _manager;

        public Department(Person manager) {
           _manager = manager;
        }

        public Person getManager() {
           return _manager;
        }
    ...

    如果客戶希望知道某人的經理是誰,他必須先取得Department對象:
        manager = john.getDepartment().getManager();
    這樣的編碼就是對客戶揭露了Department工作原理,于是客戶知道:Department用以追蹤[經理]這條信息。如果對客戶隱藏Department,可以減少耦合(coupling)。為了這一目的,我在Person中建立一個簡單的委托函數:
        public Person getManager() {
           return _department.getManager();
        }
    現在,我得修改Person的所有客戶,讓它們改用新函數:
        manager = john.getManager();
    只要完成了對Department所有函數的委托關系,并相應修改了 Person的所有客戶,我就可以移除Person中的訪問函數個體Department()了。
    posted @ 2005-08-31 13:35 ivaneeo 閱讀(193) | 評論 (0)編輯 收藏

    作法(Mechanics)
      • 對于每一個委托關系中的函數,在server端建立一個簡單的委托函數(delegating method)。
      • 調整客戶,令它只調用server提供的函數(不得跳過徑自調用下層)。
          • ==》如果client(客戶)和server不在同一個package,考慮修改委托函數(delegating method)的訪問權限,讓client得以在package之外調用它。
      • 每次調整后,編譯并測試。
      • 如果將來不再有任何客戶需要取用圖的Delegate(委托類),便可移除server中的相關訪問函數(accessor for the delegate)。
      • 編譯,測試。
    posted @ 2005-08-31 13:21 ivaneeo 閱讀(156) | 評論 (0)編輯 收藏

    動機(Motivation)
    如果某個客戶調用了[建立了server object(服務對象)的某個值域基礎之上]的函數,那么客戶就必須知曉這一委托對象(delegate object)。萬一委托關系發生變化,客戶也得相應變化。你可以在server端放置一個簡單的委托函數(delegating method),將委托關系隱藏起來,從而去除這種依存性。這么一來即便將來發生關系上的變化,變化將被限制在server中,不會涉及客戶。

    Delegate.png
    posted @ 2005-08-31 13:09 ivaneeo 閱讀(221) | 評論 (0)編輯 收藏

    僅列出標題
    共67頁: First 上一頁 43 44 45 46 47 48 49 50 51 下一頁 Last 
    主站蜘蛛池模板: 无码A级毛片免费视频内谢| 国产精品久久久久免费a∨| 久久亚洲精品人成综合网| 亚洲一区二区三区免费在线观看 | 久久精品女人天堂AV免费观看 | 亚洲网站免费观看| 亚洲AV无码资源在线观看| 亚洲日韩小电影在线观看| 成年女人视频网站免费m| 成人无码视频97免费| 精品亚洲成A人无码成A在线观看| 亚洲国产精品一区二区三区久久| 嫩草影院在线播放www免费观看| 久久久久久亚洲av无码蜜芽| 久久精品国产精品亚洲精品 | 精品少妇人妻AV免费久久洗澡| 在线毛片片免费观看| 亚洲av日韩综合一区二区三区| 亚洲欧洲国产精品你懂的| 日本高清免费aaaaa大片视频| 一区二区免费视频| 九九综合VA免费看| 亚洲综合精品第一页| 久久亚洲免费视频| 国产乱辈通伦影片在线播放亚洲| 免费无码精品黄AV电影| 一级成人a毛片免费播放| 一级毛片a免费播放王色| 亚洲国产精品免费观看| 亚洲va无码va在线va天堂| 免费人妻无码不卡中文字幕18禁| 中文免费观看视频网站| 中文字幕乱码系列免费| 国产亚洲视频在线| 亚洲欧美日韩中文无线码| 亚洲第一成年人网站| 亚洲AV无码成人专区片在线观看 | 波多野结衣中文字幕免费视频 | 色欲色香天天天综合网站免费| 一级做a爰片性色毛片免费网站 | 亚洲入口无毒网址你懂的|