隨筆-95  評論-31  文章-10  trackbacks-0
          條件滿足:
          1 當前對象本身(this)
          2 以參量形式傳入到當前對象方法中的對象
          3 當前對象的實例變量直接引用的對象
          4 當前對象的實例變量如果是一個聚集,那么聚集中的元素也都是朋友
          5 當前對象所創建的對象
          否則就不算"朋友" 代碼需優化重構

          不是“朋友”的例子:
          public class SomeOne
          {
             
          public void operation(Friend friend)
             {
               Stranger stranger 
          = friend.getStranger();
               stranger.operation();
             }
          }

          friend是SomeOne的朋友,但是在operation內部出現了stranger對象,它不是SomeOne的朋友,stranger.operation()方法應該挪到friend對象內部去,進行封裝再對SomeOne提供。
          這原則就是迪米特法則。
          優點:降低系統內部的耦合度,若修改僅僅只會影響到這個類的“朋友”們,而不會影響到當前對象。
          缺點:對象里會產生大量的小方法,這些方法僅僅只是傳遞間接的調用,因此與系統的業務邏輯無關,一個小方法內,可能僅僅只是調用了關聯對象的其它方法,而且會使系統的不同模塊之間不容易協調。

          避免該缺點:使用依賴倒置原則,比如把上面的stranger做為抽象類,stranger.operation()是個抽象方法,通過friend.getStranger()動態返回不同具體的類,這樣仍然做到了SomeOne對象不用修改,要改也只是friend.getStranger()方法內部返回不同的子對象即可,但是為了代碼整潔度,清晰明了,直接一個friend.operation(),感覺還是挪走比較好。

          23種模式里面:門面模式與中介者模式就是迪米特法則的應用
          門面模式示意圖: 顯然Facade依賴各個子系統,子系統可以有多個,客戶端直接與Facade打交道


          中介者模式示意圖:





          posted on 2013-09-24 15:34 朔望魔刃 閱讀(257) 評論(0)  編輯  收藏 所屬分類: 設計模式&&數據結構
          主站蜘蛛池模板: 策勒县| 贵定县| 司法| 水城县| 门头沟区| 聊城市| 电白县| 合山市| 大田县| 杨浦区| 乾安县| 荔浦县| 浦江县| 阿勒泰市| 天全县| 缙云县| 泸西县| 唐海县| 邵阳县| 乳源| 辽阳市| 海林市| 灵宝市| 威远县| 绥阳县| 渭南市| 本溪| 额尔古纳市| 白水县| 民丰县| 南投市| 丹凤县| 锦屏县| 潞西市| 始兴县| 友谊县| 尉犁县| 大余县| 文安县| 永仁县| 岳阳县|