日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

设计模式(六)------设计模式六大原则(5):迪米特法则

發布時間:2023/12/13 asp.net 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式(六)------设计模式六大原则(5):迪米特法则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://www.jianshu.com/p/14589fb6978e (作者簡書:涅槃1992)

揭秘迪米特法則

迪米特法則(Law of demeter,縮寫是LOD)要求:一個對象應該對其他對象保持最少了解, 通縮的講就是一個類對自己依賴的類知道的越少越好,也就是對于被依賴的類,向外公開的方法應該盡可能的少。

迪米特法則還有一種解釋:Only talk to your immediate friends,即只與直接朋友通信.首先來解釋編程中的朋友:兩個對象之間的耦合關系稱之為朋友,通常有依賴,關聯,聚合和組成等.而直接朋友則通常表現為關聯,聚合和組成關系,即兩個對象之間聯系更為緊密,通常以成員變量,方法的參數和返回值的形式出現.

那么為什么說是要與直接朋友通信呢?觀察直接朋友出現的地方,我們發現在直接朋友出現的地方,大部分情況下可以接口或者父類來代替,可以增加靈活性. (需要注意,在考慮這個問題的時候,我們只考慮新增的類,而忽視java為我們提供的基礎類.)

實例演示

不難發現,迪米特法則強調了一下兩點:

  • 第一要義:從被依賴者的角度來說:只暴露應該暴露的方法或者屬性,即在編寫相關的類的時候確定方法/屬性的權限
  • 第二要義:從依賴者的角度來說,只依賴應該依賴的對象

先來解釋第一點,我們使用計算機來說明,以關閉計算機為例:

當我們按下計算機的關機按鈕的時候,計算機會執行一些列的動作會被執行:比如保存當前未完成的任務,然后是關閉相關的服務,接著是關閉顯示器,最后是關閉電源,這一系列的操作以此完成后,計算機才會正式被關閉。

現在,我們來用簡單的代碼表示這個過程,在不考慮迪米特法則情況下,我們可能寫出以下代碼

//計算機類 public class Computer{public void saveCurrentTask(){//do something}public void closeService(){//do something}public void closeScreen(){//do something}public void closePower(){//do something}public void close(){saveCurrentTask();closeService();closeScreen();closePower();} }//人 public class Person{private Computer c;...public void clickCloseButton(){//現在你要開始關閉計算機了,正常來說你只需要調用close()方法即可,//但是你發現Computer所有的方法都是公開的,該怎么關閉呢?于是你寫下了以下關閉的流程: c.saveCurrentTask();c.closePower();c.close();//亦或是以下的操作 c.closePower();//還可能是以下的操作c.close();c.closePower();}}

發現上面的代碼中的問題了沒?
我們觀察clickCloseButton()方法,我們發現這個方法無法編寫:c是一個完全暴露的對象,其方法是完全公開的,那么對于Person來說,當他想要執行關閉的時候,卻發現不知道該怎么操作:該調用什么方法?靠運氣猜么?如果Person的對象是個不按常理出牌的,那這個Computer的對象豈不是要被搞壞么?

迪米特法則第一要義

現在我們來看看迪米特法則的第一點:從被依賴者的角度,只應該暴露應該暴露的方法。那么這里的c對象應該哪些方法應該是被暴露的呢?很顯然,對于Person來說,只需要關注計算機的關閉操作,而不關心計算機會如何處理這個關閉操作,因此只需要暴露close()方法即可。
那么上述的代碼應該被修改為:

//計算機類 public class Computer{private void saveCurrentTask(){//do something}private void closeService(){//do something}private void closeScreen(){//do something}private void closePower(){//do something}public void close(){saveCurrentTask();closeService();closeScreen();closePower();} }//人 public class Person{private Computer c;...public void clickCloseButton(){c.close();}}

看一下它的類圖:


接下來,我們繼續來看迪米特法則的第二層含義:從依賴者的角度來說,只依賴應該依賴的對象。 這句話令人有點困惑,什么叫做應該依賴的對象呢?我們還是用上面“關閉計算機”的例子來說明: 準確的說,計算機包括操作系統和相關硬件,我們可以將其劃分為System對象和Container對象。當我們關閉計算機的時候,本質上是向操作系統發出了關機指令,而實則我們只是按了一下關機按鈕,也就是我們并沒有依賴System的對象,而是依賴了Container。這里Container就是我們上面所說的直接朋友---只和直接朋友通信.

我們就這點,繼續深入討論一下: only talk to your immedate friends 這句話只說明了要和直接朋友通信,但是我覺得這還不完整,我更愿意將其補充為: make sure your friends,only talk to your immedate friends,don't speak to strangers. 大意是:確定你真正的朋友,并只和他們通信,并且不要和陌生人講話.這樣做有個很大的好處就是,能夠簡化對象與對象之間的通信,進而減輕依賴,提供更高的靈活性,當然也可以提供一定的安全性.

現在來想想現實世界中的這么一種情況:你是一個令人矚目的公眾人物,周圍的每個人都知道你的名字,當你獨自走在大街上的時候會是怎么樣的一種場景?每個人都想要和你聊天!,和你交換信息!!接著,你發現自己已經寸步難行了.如果這時候你有一個經紀人,來幫你應對周圍的人,而你就只和這個經紀人通信,這樣就大大減輕了你的壓力,不是么?此時,這個經濟人就相當于你的直接朋友.


迪米特法則第二要義

現在,我們再回顧"關機計算機"這個操作,前面的代碼只是遵從了"暴漏應該暴漏的方法"這一點,現在我們結合第二點來進行改進:System和Container相比,System并非Person的直接朋友,而Container才是(Person直接打交道的是Container).因此我們需要將原有的Computer拆分成System和Cotainer,然后使Person只與Container通信,因此代碼修改為:

//操作系統 public class System{private void saveCurrentTask(){//do something}private void closeService(){//do something}private void closeScreen(){//do something}private void closePower(){//do something}public void close(){saveCurrentTask();closeService();closeScreen();closePower();} }//硬件設備容器 public class Container{private System mSystem;public void sendCloseCommand(){mSystem.close();} }//人 ublic class Person{private Container c;....public void clickCloseButton(){c.sendCloseCommand();}}

來看一下它的類圖:



對比這兩種方案,明顯這種方案二的解耦程度更高,靈活大大增強.不難發現,這應用了我們前面提到的依賴倒置,即面向接口編程.

除此之外,我們發現隨著不斷的改進,類的數量也在不斷的增加,從2個增加到5個,這意味著為了解耦和提高靈活性通常要編寫的類的數量會翻倍.因此,你需要在這做一個權衡,切莫刻意為了追求設計,而導致整個系統非常的冗余,最終可能得不償失.


總結

有人會覺得Container像是一個中介(代理).沒錯,我們確實可以稱其為中介,但這并不能否認他是我們的直接朋友:在很多情況下,中介可以說是我們的一種代表,因此將其定義為直接朋友是沒有任何問題的.比如,當你想要租房的時候,你可以找房屋中介,對方會按照你的標準為你尋找合適的住房.但是問題來了:那么做一件事情需要多少中介呢?總不能是我委托一個中介A幫我找房子,但中介A又委托了中介B,中介B又委托了中介C....等等,如果真的是這樣,那還不如我自己去找房子效率更高.在實際開發中,委托的層次要控制在6層以下,多余6層以上的會使得系統過分的冗余和并切會委托層次過多而導致開發人員無法正確的理解流程,產生風險的可能會大大提高.

到目前,我們已經徹底的了解了迪米特法則.



轉載于:https://www.cnblogs.com/chz-blogs/p/9380982.html

總結

以上是生活随笔為你收集整理的设计模式(六)------设计模式六大原则(5):迪米特法则的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久草视频免费在线播放 | 欧美一区二区日韩 | mm131在线 | 亚洲av无码乱码在线观看富二代 | 欧美色偷偷 | 国产又粗又猛又爽又黄又 | av无毛| 999伊人| 日本男女网站 | 国模私拍大尺度裸体av | 免费99精品国产自在在线 | 亚洲av无码一区二区乱子伦as | 日韩不卡的av | 扒开jk护士狂揉免费 | 一出一进一爽一粗一大视频 | 国产第99页 | 精品视频免费观看 | 中文久久久久 | 在线啪| 中文字幕69页 | 欧美成人做爰大片免费看黄石 | 少妇搡bbbb搡bbb搡澳门 | 日日干夜夜拍 | 奇米第四色影视 | 少妇全黄性生交片 | 国产超碰人人模人人爽人人添 | 中文字幕一区二区人妻电影 | 五月天激情影院 | 九色激情网| 窝窝午夜精品一区二区 | 中文字幕在线观看一区二区三区 | 日韩免 | yjizz国产| 女人十八岁毛片 | av久久久久久 | 色噜噜狠狠一区二区三区 | 欧美日韩在线观看一区二区三区 | 三级中文字幕 | xxx国产在线观看 | 亚洲精品视频一区二区 | 欧美激情aaa | 天天干天天透 | 1级黄色大片 | 玖玖精品在线视频 | 亚洲熟妇中文字幕五十中出 | 国产黄a三级三级看三级 | 91亚洲精品久久久蜜桃网站 | 久久伊人操 | 黄a在线观看 | 久操av在线 | 色综合天天色 | 秋霞av一区二区三区 | 国产传媒国产传媒 | 久久黄色片 | 久久国产精 | 东北高大丰满bbbbzbbb | 手机在线看片日韩 | 欧美在线性 | 二男一女一级一片 | 免费在线国产精品 | 久久精品99国产精 | 日本色中色 | 国产一级淫片a | 四虎伊人| 少妇无内裤下蹲露大唇视频 | 精品黑人一区二区三区国语馆 | 欧美青草视频 | 日本骚少妇 | 91久久在线| 亚洲国产成人精品女人久久 | 少妇裸体性生交 | 日本熟妇一区二区三区 | 亚洲女人天堂成人av在线 | 亚洲精品免费在线观看 | 天天舔天天操 | 亚洲人成网站999久久久综合 | 中文第一页 | 性高湖久久久久久久久aaaaa | 欧美日韩一区二区三区视频 | 久草新免费 | 久久综合久久久久 | 肉色欧美久久久久久久免费看 | 国产一级黄色 | 在线观看的网站 | 欧美11一13sex性hd | 91口爆一区二区三区在线 | 免费看欧美大片 | 在线观看精品国产 | 日韩精品免费一区二区在线观看 | 91视频精品| 免费视频网站在线观看入口 | 国产一区毛片 | 秋霞在线观看秋 | 欧美精品99久久 | 久草福利在线视频 | 午夜影院试看 | 亚洲成人精品av | 夜色一区二区三区 | 中文字幕无码乱码人妻日韩精品 |