《設計模式之禪》之六大設計原則下篇

本文主要講迪米特法則和開閉原則。算法

1、迪米特法則

1.定義

迪米特法則也稱最少知道原則,雖然名字不一樣,但描述的是同一個規則:一個對象應該對其餘對象有最少的瞭解。通俗地講,一個類應該對本身須要耦合或調用的類知道得最少,你(被耦合或調用的類)的內部是如何複雜都和我不要緊,那是你的事情,我就知道你提供的這麼多public方法,我就調用這麼多,其餘的我一律不關心。數據庫

2.迪米特法則對類的低耦合提出明確的要求

4層含義以下:設計模式

(1)只和朋友交流

迪米特法則還有一個解釋是:只與直接的朋友通訊。架構

什麼叫直接的朋友?
每一個對象都必然會與其餘對象有耦合關係,兩個對象之間的耦合就成爲朋友關係,這種關係的類型有不少,例如組合、聚合、依賴等。函數

注意:
一個類只和朋友交流,不與陌生類交流,不要出現getA().getB().getC().getD()這種狀況(在一種極端的狀況下容許出現這種訪問,即每一個點號後面的返回類型都相同),類與類之間的關係是創建在類間的,而不是方法間,所以一個方法儘可能不引入一個類中不存在的對象,固然,JDK API提供的類例外。測試

(2)朋友間也是有距離的

人和人之間是有距離的,太遠關係逐漸疏離,最終形同陌路;太近就相互刺傷。對朋友關係描述最貼切的故事就是:兩隻刺蝟取暖,太遠取不到溫暖,太近刺傷對方,必須保持一個既能取暖又不刺傷對方的距離。迪米特法則就是對這個距離進行描述,即便是朋友類之間也不能無話不說,無所不知。spa

注意:迪米特法則要求類」羞澀」一點,儘可能不要對外公佈太多public方法和非靜態的public變量,儘可能內斂,多使用private、package-private、protected等訪問權限。設計

(3)是本身的就是本身的

在實際應用中常常會出現這樣一個方法:放在本類中也能夠,放在其餘類中也沒有錯,那怎麼去衡量呢?你能夠堅持這樣一個原則:若是一個方法放在本類中,既不增長類間關係,也對本類不產生負面影響,那就放置在本類中。對象

(4)謹慎使用Serializable

3.最佳實踐

迪米特法則的核心觀念:
類間解耦,弱耦合,只有弱耦合了之後,類的複用率才能夠提升。其要求的結果就是:產生了大量的中轉或跳轉類,致使系統的複雜性提升,同時也爲維護帶來了難度。因此咱們在採用迪米特法則時,須要反覆權衡,既作到讓結構清晰,又作到高內聚低耦合。接口

2、開閉原則

1.定義

一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。

注意:
開閉原則對擴展開放,對修改關閉,並不意味着不作任何修改,低層模塊的變動,必然要有高層模塊進行耦合,不然就是一個孤立無心義的代碼片斷。

變化能夠概括爲以下三類:

(1)邏輯變化

只變化一個邏輯,而不涉及其餘模塊,好比原有的一個算法是ab+c,如今須要修改成ab*c,能夠經過修改原有類中的方法的方式來完成,前提條件是全部依賴或關聯類都按照相同的邏輯處理。

(2)子模塊變化

一個模塊變化,會對其餘的模塊產生影響,特別是一個低層次的模塊變化必然引發高層模塊的變化,所以在經過擴展完成變化時,高層次的模塊修改是必然的。

(3)可見視圖變化

可見視圖是提供給客戶使用的界面,如JSP程序、Swing界面等,該部分的變化通常會引發連鎖反應(這個連鎖反應,我相信使用過JSP做爲視圖層的朋友們都深有感觸)

2.爲何要採用開閉原則

都說開閉原則是很是重要的,可經過如下幾個方面來理解其重要性:

(1)開閉原則對測試的影響

(2)開閉原則能夠提升複用性

(3)開閉原則能夠提升可維護性

(4)面向對象開發的要求

3.如何使用開閉原則

(1)抽象約束

抽象是對一組事物的通用描述,沒有具體的實現,也就表示它能夠由很是多的可能性,能夠跟隨需求的變化而變化。所以,經過接口或抽象類能夠約束一組可能變化的行爲,而且可以實現對擴展開放,其包含三層含義:
第一,經過接口或抽象類約束擴展,對擴展進行邊界限定,不容許出如今接口或抽象類中不存在的public方法;
第二,參數類型、引用對象儘可能使用接口或抽象類,而不是實現類;
第三,抽象層儘可能保持穩定,一旦肯定即不容許修改;

(2)元數據控制模塊行爲

儘可能使用元數據來控制程序的行爲,減小重複開放。

什麼是元數據?
用來描述環境和數據的數據,通俗地說就是配置參數,參數能夠從文件中得到,也能夠從數據庫中得到。

(3)指定項目章程

在一個團隊中,創建項目章程是很是重要的,由於章程中指定了全部人員都必須遵照的約定,對項目來講,約定優於配置。

(4)封裝變化

對變化的封裝包含兩層含義:
第一,將相同的變化封裝到一個接口或抽象類中;
第二,將不一樣的變化封裝到不一樣的接口或抽象類中,不該該由兩個不一樣的變化出如今同一個接口或抽象類中;

封裝變化,也就是受保護的變化,找出預計有變化或不穩定的點,咱們爲這些變化點建立穩定的接口,準確地講是封裝可能發生的變化,一旦預測或」第六感」發覺有變化,就能夠進行封裝,23種設計模式都是從各個不一樣的角度對變化進行封裝的。

4.最佳實踐

咱們在使用開閉原則時要注意如下幾個問題?

    • 開閉原則也只是一個原則(開閉原則只是精神口號,實現擁抱變化的方法很是多,並不侷限於6大設計原則,可是遵循這6大設計原則基本上能夠應對大多數變化);
    • 項目規章很是重要(優秀的章程能夠給項目帶來不少好處,如提升開放效率、下降缺陷率、提升團隊士氣、提升技術成員水平等);
    • 預知變化(適應將來的變化,好比將來新增某項功能需求,在不影響現有的架構下,輕鬆擴展就能實現等);
相關文章
相關標籤/搜索