本文主要講迪米特法則和開閉原則。算法
迪米特法則也稱最少知道原則,雖然名字不一樣,但描述的是同一個規則:一個對象應該對其餘對象有最少的瞭解。通俗地講,一個類應該對本身須要耦合或調用的類知道得最少,你(被耦合或調用的類)的內部是如何複雜都和我不要緊,那是你的事情,我就知道你提供的這麼多public方法,我就調用這麼多,其餘的我一律不關心。數據庫
4層含義以下:設計模式
迪米特法則還有一個解釋是:只與直接的朋友通訊。架構
什麼叫直接的朋友?
每一個對象都必然會與其餘對象有耦合關係,兩個對象之間的耦合就成爲朋友關係,這種關係的類型有不少,例如組合、聚合、依賴等。函數
注意:
一個類只和朋友交流,不與陌生類交流,不要出現getA().getB().getC().getD()這種狀況(在一種極端的狀況下容許出現這種訪問,即每一個點號後面的返回類型都相同),類與類之間的關係是創建在類間的,而不是方法間,所以一個方法儘可能不引入一個類中不存在的對象,固然,JDK API提供的類例外。測試
人和人之間是有距離的,太遠關係逐漸疏離,最終形同陌路;太近就相互刺傷。對朋友關係描述最貼切的故事就是:兩隻刺蝟取暖,太遠取不到溫暖,太近刺傷對方,必須保持一個既能取暖又不刺傷對方的距離。迪米特法則就是對這個距離進行描述,即便是朋友類之間也不能無話不說,無所不知。spa
注意:迪米特法則要求類」羞澀」一點,儘可能不要對外公佈太多public方法和非靜態的public變量,儘可能內斂,多使用private、package-private、protected等訪問權限。設計
在實際應用中常常會出現這樣一個方法:放在本類中也能夠,放在其餘類中也沒有錯,那怎麼去衡量呢?你能夠堅持這樣一個原則:若是一個方法放在本類中,既不增長類間關係,也對本類不產生負面影響,那就放置在本類中。對象
迪米特法則的核心觀念:
類間解耦,弱耦合,只有弱耦合了之後,類的複用率才能夠提升。其要求的結果就是:產生了大量的中轉或跳轉類,致使系統的複雜性提升,同時也爲維護帶來了難度。因此咱們在採用迪米特法則時,須要反覆權衡,既作到讓結構清晰,又作到高內聚低耦合。接口
一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。
注意:
開閉原則對擴展開放,對修改關閉,並不意味着不作任何修改,低層模塊的變動,必然要有高層模塊進行耦合,不然就是一個孤立無心義的代碼片斷。
變化能夠概括爲以下三類:
只變化一個邏輯,而不涉及其餘模塊,好比原有的一個算法是ab+c,如今須要修改成ab*c,能夠經過修改原有類中的方法的方式來完成,前提條件是全部依賴或關聯類都按照相同的邏輯處理。
一個模塊變化,會對其餘的模塊產生影響,特別是一個低層次的模塊變化必然引發高層模塊的變化,所以在經過擴展完成變化時,高層次的模塊修改是必然的。
可見視圖是提供給客戶使用的界面,如JSP程序、Swing界面等,該部分的變化通常會引發連鎖反應(這個連鎖反應,我相信使用過JSP做爲視圖層的朋友們都深有感觸)
都說開閉原則是很是重要的,可經過如下幾個方面來理解其重要性:
抽象是對一組事物的通用描述,沒有具體的實現,也就表示它能夠由很是多的可能性,能夠跟隨需求的變化而變化。所以,經過接口或抽象類能夠約束一組可能變化的行爲,而且可以實現對擴展開放,其包含三層含義:
第一,經過接口或抽象類約束擴展,對擴展進行邊界限定,不容許出如今接口或抽象類中不存在的public方法;
第二,參數類型、引用對象儘可能使用接口或抽象類,而不是實現類;
第三,抽象層儘可能保持穩定,一旦肯定即不容許修改;
儘可能使用元數據來控制程序的行爲,減小重複開放。
什麼是元數據?
用來描述環境和數據的數據,通俗地說就是配置參數,參數能夠從文件中得到,也能夠從數據庫中得到。
在一個團隊中,創建項目章程是很是重要的,由於章程中指定了全部人員都必須遵照的約定,對項目來講,約定優於配置。
對變化的封裝包含兩層含義:
第一,將相同的變化封裝到一個接口或抽象類中;
第二,將不一樣的變化封裝到不一樣的接口或抽象類中,不該該由兩個不一樣的變化出如今同一個接口或抽象類中;
封裝變化,也就是受保護的變化,找出預計有變化或不穩定的點,咱們爲這些變化點建立穩定的接口,準確地講是封裝可能發生的變化,一旦預測或」第六感」發覺有變化,就能夠進行封裝,23種設計模式都是從各個不一樣的角度對變化進行封裝的。
咱們在使用開閉原則時要注意如下幾個問題?