天天看點

設計模式七大原則(1.2)設計原則核心思想1.單一職責原則(SRP Single Responsibility Principle)2.接口隔離原則3.依賴倒置原則4.裡氏替換原則5.開閉原則(OCP Open Closed Principle)6.迪米特原則(最少知識原則)7.合成複用原則

什麼是設計模式原則?

設計模式原則是設計設計模式的原則,也就是設計模式應當如何設計所遵守的原則;換句話說,設計模式的設計是基于設計模式原則的。

設計模式的七大原則

  • 單一職責原則
  • 接口隔離原則
  • 依賴倒置原則
  • 裡氏替換原則
  • 開閉原則
  • 迪米特原則
  • 合成複用原則

設計原則核心思想

設計原則的目的是建構出更加穩定和健壯的軟體。而像這樣的軟體要求

  • 松耦合
  • 可擴充性強

1.單一職責原則(SRP Single Responsibility Principle)

什麼是單一職責原則?

一個類隻負責一項功能。

單一職責原則的目的

通過降低類的複雜度進而提高類的可讀性,可擴充性

單一職責的粒度(類與方法)

通常情況下遵守單一職責原則是在類的粒度上的,但是當代碼邏輯足夠簡單的情況下,可在方法上保持單一職責原則。

2.接口隔離原則

接口與接口隔離

接口的作用之一是規範類,實作類的松耦合,進而實作軟體的松耦合。

換句話說,接口隔離也是一種單一職責原則的實作。

接口隔離原則的目的

接口隔離原則的要求就是明确接口功能,盡可能細分接口。

接口的細化直接導緻整個系統靈活性,但同時會帶來結構的複雜性。

比如說預先定義了10個接口,為了滿足接口隔離而将接口分成20個。那麼類在實作接口上會變得更加靈活,但接口的增多會導緻結構的複雜性。

3.依賴倒置原則

依賴于抽象,不要依賴于具體。

依賴倒置的是什麼?

類與類之間依賴變為類對接口的依賴。

[from 百度百科]

設計模式七大原則(1.2)設計原則核心思想1.單一職責原則(SRP Single Responsibility Principle)2.接口隔離原則3.依賴倒置原則4.裡氏替換原則5.開閉原則(OCP Open Closed Principle)6.迪米特原則(最少知識原則)7.合成複用原則

目的

解耦,增強子產品複用性。

依賴倒置原則的思想與Spring IOC容器機制相呼應,類對于接口的依賴降低了類之間的耦合性,而IOC中類對于容器的依賴同樣解決了類之間高耦合的問題。

依賴關系傳遞的三種方式

  • 接口傳遞
  • 構造方法傳遞
  • setter傳遞
//接口傳遞
interface Car
{
    void drive();
}

interface Person
{
    void lunch(Car car);
}


//構造方法傳遞

interface Bicycle
{
    void ride();
}

class Tom
{
    private Bicycle bicycle;

    Tom(Bicycle bicycle)
    {
        this.bicycle=bicycle;

    }

}

//setter方法傳遞

interface Weather
{
    void sun();
}

class Today
{
    private Weather weather;

    public void setWeather(Weather weather) {
        this.weather = weather;
    }
}           

複制

4.裡氏替換原則

繼承的利與弊

利:實作了代碼重用,更加友善的實作了功能擴充。

弊:增強了類之間的耦合性

什麼是裡氏替換原則?

在子類中盡量不要重寫父類的方法。

如果不得不重寫,可提取出基類共同繼承。另外也可通過聚合,依賴,組合的方式替代繼承。

class A
{
    public void a1(){
        
    }
    public void a2(){
        
    }
    
}

class B extends A
{
    @Override
    public void a1()
    {
        
    }
    
}

//提取基類後

class Base
{
    public void a2
    {
        
    }
}
class A extends Base
{
    public void a1(){

    }
}

class B extends Base
{
    public void a1(){

    }
}           

複制

5.開閉原則(OCP Open Closed Principle)

什麼是開閉原則?

對擴充開放,對修改關閉。

通俗的說,在軟體功能需要擴充時,盡量增加代碼,而不是修改原有代碼。

for example

abstract class Action
{
    abstract public void action();
}

class Describe
{
    public void describe(Action action)
    {
        action.action();
    }
}

class A extends Action
{
    public void action()
    {
        System.out.println("跑步");
    }
}
class B extends Action
{
    public void action()
    {
        System.out.println("瑜伽");
    }
}
class C extends Action
{
    public void action()
    {
        System.out.println("健身");
    }
}

class X extends Action
{
    public void action()
    {
        System.out.println("xxx");
    }
}



public class Main
{
    public static void main(String[] args)
    {
        Describe describe = new Describe();
        describe.describe(new A());
        describe.describe(new B());
        describe.describe(new C());
        describe.describe(new X());
    }
}           

複制

定義一個抽象類,其中有action方法,ABC類都有各自的行為,繼承抽象類後重寫方法。這些需要擴充新功能時隻需新加一個像X一樣的類就可以了。基本上不需要修改任何位置,隻是擴充了功能。

6.迪米特原則(最少知識原則)

什麼是迪米特原則?

一個對象應該對其他對象保持最少的了解。

表現形式

隻與直接的朋友通信。

直接的朋友:除了出現在局部變量的類之外,都是直接朋友。

換句話說:迪米特法則要求局部變量中最好不要出現陌生的類。

目的

降低類之間的耦合。(耦合隻能盡量降低,無法消除)

7.合成複用原則

盡量使用合成/聚合代替繼承。

合成/聚合:某種類與類之間建立聯系的方式。其耦合度低于繼承。

參考資料:

設計模式之六大原則——接口隔離原則(ISP)

依賴倒置原則

面向對象原則之一 依賴倒置原則

對依賴倒置原則(DIP)及Ioc、DI、Ioc容器的一些了解

裡氏替換原則