【設計模式】七大原則

一、單一職責原則

定義:
一個類只負責一項職責。

優點:
①降低類的複雜度;②提高代碼可讀性;③提高代碼可維護性。

違反條件:
①類中方法足夠少,可以僅在方法級別遵循改原則;
②方法邏輯足夠簡單,可以在方法級別違反該原則。

二、接口隔離原則

定義:
客戶端不應該依賴它不需要的接口(即接口中含有不需要實現的方法)。一個類對另一個類的依賴應該建立在最小的接口上。

鉤子方法:
鉤子的實現方法是對於抽象方法或者接口中定義的方法的一個空實現。
比如說有一個接口有7個方法,而你只想用其中一個方法,那麼你可以寫一個抽象類實現這個接口,在這個抽象類裏將你要用的那個方法設置爲abstract,其它方法進行空實現,然後再繼承這個抽象類,就不需要實現其它不用的方法。

//動物接口
public interface IAnimal{
	void eat();
	void fly();
	void run();
}

//陸地動物不需要實現fly()這個方法
public abstract class TerrestrialAnimal implements IAnimal{
	@Override
	abstract void eat();

	@Override
	void fly(){
		//什麼也不做
	};

	@Override
	abstract void run();
}

//陸生動物實例
public class Dog extends TerrestrialAnimal{

	@Override
	void eat(){
		System.out.println("喫");
	}

	@Override
	void run(){
		System.out.println("跑");
	}
}

三、依賴倒置原則

定義:
① 高層模塊不應該依賴底層模塊,二者都應該依賴抽象。
② 抽象不應該依賴細節,細節應該依賴抽象。
③ 依賴倒置的中心思想是 面向接口編程
④ 依賴倒置原則是基於這樣的設計理念:
 – 相對於細節的多變性,抽象的東西要穩定的多。
 – 以抽象爲基礎搭建的架構比以細節爲基礎搭建的架構要穩定的多。
⑤使用接口或抽象類的目的是指定好規範,而不涉及任何具體的操作,把展現細節的任務交給他們的實現類來完成。

依賴關係傳遞方式:
1.接口傳遞

//開關
interface IOpenClose{
    public void open(ITv tv);
}
//電視機
interface ITv{
    public void play();
}
//開關實現類(無需關注play方法的實現)
class IOpenCloseImpl implements IOpenClose{
    @Override
    public void open(ITv tv) {
        tv.play();
    }
}

2.構造方法傳遞

interface IOpenClose{
    public void open();
}
 
interface Itv{
    public void play();
}
 
class IOpenCloseImpl implements IOpenClose{
    public Itv tv;
    public IOpenCloseImpl(Itv tv){
        this.tv = tv;
    }
    @Override
    public void open() {
        this.tv.play();
    }
}

3.setter傳遞

interface IOpenClose{
    public void open();
    public void setItv(Itv tv);
}
 
interface Itv{
    public void play();
}
 
class IOpenCloseImpl implements IOpenClose{
    private Itv tv;
 
    @Override
    public void setItv(Itv tv) {
        this.tv = tv;
    }
 
    @Override
    public void open() {
        this.tv.play();
    }
 
}

注意事項及細節:
1.低層模塊儘量有接口或者抽象類;
2.變量的聲明儘量是抽象類或接口,有利於程序的擴展和優化;
3.繼承時需遵循里氏替換原則

四、里氏替換原則

定義:
所有引用基類(父類)的地方必須能透明地使用其子類對象。

通俗概念:
子類可以擴展父類的功能,單不能修改父類原有的功能。包含以下4層含義:

①子類可以實現父類的抽象方法,但不能覆蓋(重寫)父類的非抽象方法;
②子類可以增加增加特有的方法;
③子類重載父類的方法時,方法的前置條件(方法形參)要比父類輸入的參數更寬鬆;
④子類實現父類的抽象方法時,方法的後置條件(返回值)要比父類更嚴格。

優點:
解決繼承中的可能產生的問題。

繼承的缺點:
子類重寫父類方法,可能造成原有功能出現錯誤;

解決方法:
①去掉原來的父類和子類的繼承關係,讓它們都繼承一個更通俗的基類,用依賴、聚合、組合等關係替代;
②使用 final 關鍵字修飾父類中不希望被子類重寫的方法。

五、開閉原則

定義:
① 一個軟件實體,如類、模塊和函數應該對擴展開放,對修改關閉。
②一個軟件實體應該通過擴展來實現變化。而不是通過修改已有的代碼來實現變化。

通俗概念:
對擴展開發,對修改關閉。

優點:
避免修改原有代碼而造成原要正常工作的代碼出現故障。

六、迪米特法則

定義:
①一個對象應該對其他對象有最少的瞭解,所以迪米特法則又叫做 最少知識原則
②類與類關係越密切,耦合度越大。
③對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供public方法,不泄露任何信息。
④只與 直接朋友 通信。

優點:
降低類之間的耦合。每個對象儘量減少對其他對象的瞭解,使得系統的功能模塊功能獨立,相互之間不存在(或很少有)依賴關係。

直接朋友:
只要兩個對象之間耦合(依賴、關聯、組合、聚合),這兩個對象就是朋友關係。其中,出現 成員變量方法參數方法返回值 中的類爲直接朋友。
出現在局部變量中的類不是直接朋友。
陌生的類最好不要以局部變量的形式出現在類的內部。

七、合成複用原則

定義:
儘量使用合成 / 聚合的方式,而不是繼承。

問題來源:
繼承複用的缺點:
在這裏插入圖片描述
① 繼承複用破壞包裝。
繼承將父類的實現細節暴露給了子類,父類的內部細節常常對子類是透明的,因此這種複用是透明的複用,又叫 白箱 複用。
② 如果父類的實現改變了,那麼子類的實現也不得不發生改變。因此,當一個父類發生了改變時,這種改變會傳導到一級又一級的子類,使得設計師不得不相應的改變這些子類,以適應超類的變化。
③ 從父類繼承而來的實現是靜態的,不可能在運行時間內發生變化,因此沒有足夠的靈活性。

優點:
在這裏插入圖片描述
①它維持了類的封裝性。
成分對象的內部細節是新對象看不見的,所以這種複用又稱爲 黑箱 複用。
②新舊類之間的耦合度低。
這種複用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。
③複用的靈活性高。
這種複用可以在運行時動態進行,新對象可以動態地引用與成分對象類型相同的對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章