亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

面向對象六大原則是什么

發布時間:2021-10-23 18:02:51 來源:億速云 閱讀:106 作者:iii 欄目:編程語言

本篇內容介紹了“面向對象六大原則是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

0x01: 單一職責原則

單一職責原則的定義是就一個類而言,應該僅有一個引起他變化的原因。也就是說一個類應該只負責一件事情。如果一個類負責了方法M1,方法M2兩個不同的事情,當M1方法發生變化的時候,我們需要修改這個類的M1方法,但是這個時候就有可能導致M2方法不能工作。這個不是我們期待的,但是由于這種設計卻很有可能發生。所以這個時候,我們需要把M1方法,M2方法單獨分離成兩個類。讓每個類只專心處理自己的方法。
單一職責原則的好處如下:

  1. 可以降低類的復雜度,一個類只負責一項職責,這樣邏輯也簡單很多

  2. 提高類的可讀性,和系統的維護性,因為不會有其他奇怪的方法來干擾我們理解這個類的含義

  3. 當發生變化的時候,能將變化的影響降到最小,因為只會在這個類中做出修改。

0x02: 開閉原則

開閉原則和單一職責原則一樣,是非常基礎而且一般是常識的原則。開閉原則的定義是軟件中的對象(類,模塊,函數等)應該對于擴展是開放的,但是對于修改是關閉的。
當需求發生改變的時候,我們需要對代碼進行修改,這個時候我們應該盡量去擴展原來的代碼,而不是去修改原來的代碼,因為這樣可能會引起更多的問題。
這個準則和單一職責原則一樣,是一個大家都這樣去認為但是又沒規定具體該如何去做的一種原則。
開閉原則我們可以用一種方式來確保他,我們用抽象去構建框架,用實現擴展細節。這樣當發生修改的時候,我們就直接用抽象了派生一個具體類去實現修改。

0x03: 里氏替換原則

里氏替換原則是一個非常有用的一個概念。他的定義

如果對每一個類型為T1的對象o1,都有類型為T2的對象o2,使得以T1定義的所有程序P在所有對象o1都替換成o2的時候,程序P的行為都沒有發生變化,那么類型T2是類型T1的子類型。

這樣說有點復雜,其實有一個簡單的定義

所有引用基類的地方必須能夠透明地使用其子類的對象。

里氏替換原則通俗的去講就是:子類可以去擴展父類的功能,但是不能改變父類原有的功能。他包含以下幾層意思:

  • 子類可以實現父類的抽象方法,但是不能覆蓋父類的非抽象方法。

  • 子類可以增加自己獨有的方法。

  • 當子類的方法重載父類的方法時候,方法的形參要比父類的方法的輸入參數更加寬松。

  • 當子類的方法實現父類的抽象方法時,方法的返回值要比父類更嚴格。

里氏替換原則之所以這樣要求是因為繼承有很多缺點,他雖然是復用代碼的一種方法,但同時繼承在一定程度上違反了封裝。父類的屬性和方法對子類都是透明的,子類可以隨意修改父類的成員。這也導致了,如果需求變更,子類對父類的方法進行一些復寫的時候,其他的子類無法正常工作。所以里氏替換法則被提出來。
確保程序遵循里氏替換原則可以要求我們的程序建立抽象,通過抽象去建立規范,然后用實現去擴展細節,這個是不是很耳熟,對,里氏替換原則和開閉原則往往是相互依存的。

0x04: 依賴倒置原則

依賴倒置原則指的是一種特殊的解耦方式,使得高層次的模塊不應該依賴于低層次的模塊的實現細節的目的,依賴模塊被顛倒了。
這也是一個讓人難懂的定義,他可以簡單來說就是

高層模塊不應該依賴底層模塊,兩者都應該依賴其抽象
抽象不應該依賴細節
細節應該依賴抽象

在Java 中抽象指的是接口或者抽象類,兩者皆不能實例化。而細節就是實現類,也就是實現了接口或者繼承了抽象類的類。他是可以被實例化的。高層模塊指的是調用端,底層模塊是具體的實現類。在Java中,依賴倒置原則是指模塊間的依賴是通過抽象來發生的,實現類之間不發生直接的依賴關系,其依賴關系是通過接口是來實現的。這就是俗稱的面向接口編程。
下面有一個例子來講述這個問題。這個例子是工人用錘子來修理東西。代碼如下:

public class Hammer {
    public String function(){
        return "用錘子修理東西";
    }
}

public class Worker {
    public void fix(Hammer hammer){
        System.out.println("工人" + hammer.function());
    }


    public static void main(String[] args) {
        new Worker().fix(new Hammer());
    }
}

這個是一個很簡單的例子,但是如果我們要新增加一個功能,工人用 螺絲刀來修理東西,在這個類,我們發現是很難做的。因為我們Worker類依賴于一個具體的實現類Hammer。所以我們用到面向接口編程的思想,改成如下的代碼:

public interface Tools {
    public String function();
}

然后我們的Worker是通過這個接口來于與其他細節類進行依賴。代碼如下:

public class Worker {
    public void fix(Tools tool){
        System.out.println("工人" + tool.function());
    }


    public static void main(String[] args) {
        new Worker().fix(new Hammer());
        new Worker().fix(new Screwdriver());

    }
}

Hammer類與Screwdriver類實現這個接口

public class Hammer implements Tools{
    public String function(){
        return "用錘子修理東西";
    }
}

public class Screwdriver implements Tools{
    @Override
    public String function() {
        return "用螺絲刀修理東西";
    }
}

這樣,通過面向接口編程,我們的代碼就有了很高的擴展性,降低了代碼之間的耦合度,提高了系統的穩定性。

0x05: 接口隔離原則

接口隔離原則的定義是

客戶端不應該依賴他不需要的接口

換一種說法就是類間的依賴關系應該建立在最小的接口上。這樣說好像更難懂。我們通過一個例子來說明。我們知道在Java中一個具體類實現了一個接口,那必然就要實現接口中的所有方法。如果我們有一個類A和類B通過接口I來依賴,類B是對類A依賴的實現,這個接口I有5個方法。但是類A與類B只通過方法1,2,3依賴,然后類C與類D通過接口I來依賴,類D是對類C依賴的實現但是他們卻是通過方法1,4,5依賴。那么是必在實現接口的時候,類B就要有實現他不需要的方法4和方法5 而類D就要實現他不需要的方法2,和方法3。這簡直就是一個災難的設計。
所以我們需要對接口進行拆分,就是把接口分成滿足依賴關系的最小接口,類B與類D不需要去實現與他們無關接口方法。比如在這個例子中,我們可以把接口拆成3個,第一個是僅僅由方法1的接口,第二個接口是包含2,3方法的,第三個接口是包含4,5方法的。
這樣,我們的設計就滿足了接口隔離原則。
以上這些設計思想用英文的第一個字母可以組成SOLID ,滿足這個5個原則的程序也被稱為滿足了SOLID準則。

0x06:迪米特原則

迪米特原則也被稱為最小知識原則,他的定義

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

因為類與類之間的關系越密切,耦合度越大,當一個類發生改變時,對另一個類的影響也越大,所以這也是我們提倡的軟件編程的總的原則:低耦合,高內聚。
迪米特法則還有一個更簡單的定義

只與直接的朋友通信。首先來解釋一下什么是直接的朋友:每個對象都會與其他對象有耦合關系,只要兩個對象之間有耦合關系,我們就說這兩個對象之間是朋友關系。耦合的方式很多,依賴、關聯、組合、聚合等。其中,我們稱出現成員變量、方法參數、方法返回值中的類為直接的朋友,而出現在局部變量中的類則不是直接的朋友。也就是說,陌生的類最好不要作為局部變量的形式出現在類的內部。

這里我們可以用一個現實生活中的例子來講解一下。比如我們需要一張CD,我們可能去音像店去問老板有沒有我們需要的那張CD,老板說現在沒有,等有的時候你們來拿就行了。在這里我們不需要關心老板是從哪里,怎么獲得的那張CD,我們只和老板(直接朋友)溝通,至于老板從他的朋友那里通過何種條件得到的CD,我們不關心,我們不和老板的朋友(陌生人)進行通信,這個就是迪米特的一個應用。說白了,就是一種中介的方式。我們通過老板這個中介來和真正提供CD的人發生聯系。

“面向對象六大原則是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柯坪县| 乌拉特后旗| 长宁区| 安图县| 齐齐哈尔市| 黑河市| 岢岚县| 繁峙县| 台北市| 灌阳县| 盐山县| 城口县| 牙克石市| 磐石市| 碌曲县| 云梦县| 师宗县| 上蔡县| 柳江县| 桐梓县| 乐亭县| 江山市| 乐平市| 荣成市| 绥江县| 蒲城县| 金昌市| 和林格尔县| 永福县| 永康市| 林周县| 巴塘县| 华阴市| 尉氏县| 宜川县| 洞口县| 界首市| 调兵山市| 富蕴县| 新泰市| 石林|