一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

設(shè)計(jì)模式——六大設(shè)計(jì)原則

 印度阿三17 2020-12-21

文章目錄

一、單一職責(zé)原則

單一職責(zé)原則簡稱 SRP,他想表達(dá)的就是字面意思,一個(gè)類只承擔(dān)一個(gè)職責(zé)。

有時(shí)候我們可以將一個(gè)復(fù)雜的接口拆成兩個(gè)不同的接口,這兩個(gè)接口承擔(dān)著不同的責(zé)任,這就是依賴了單一職責(zé)原則;它的定義就是:應(yīng)該有且僅有一個(gè)原因引起類的變更。

關(guān)于 職責(zé) 的定義很模糊,什么才是職責(zé)呢?不同的人有不同的解讀,所以該原則很難運(yùn)用,需要開發(fā)者的慧眼。


下面以大學(xué)學(xué)生工作管理程序?yàn)槔榻B單一職責(zé)原則的應(yīng)用。

二、里式替換原則

里式替換原則也叫 LSP 原則,沒錯(cuò)就是你想的那個(gè) lsp ??。


其實(shí)是英文簡寫啦,LSP 即 Liskov Substitution Principle。

繼承是非常優(yōu)秀的語言機(jī)制,它的優(yōu)點(diǎn)如下:

  1. 代碼共享:父類共享給子類;
  2. 提高代碼的可擴(kuò)展性:很多框架的接口都是通過繼承父類實(shí)現(xiàn)的;

缺點(diǎn)是增加了代碼的耦合性,降低了代碼的靈活性。

但是從整體上看,繼承還是利大于弊的,我們想要將利最大化,就需要用到 里式替換 了。


里氏替換原則通俗來講就是:

  • 子類可以擴(kuò)展父類的功能,但不能改變父類原有的功能
  • 只要父類出現(xiàn)的地方子類就可以出現(xiàn),而且替換為子類不會(huì)出現(xiàn)任何錯(cuò)誤。

三、依賴倒置原則

依賴倒置原則的 3 個(gè)含義:

  • 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象;
  • 抽象不應(yīng)該依賴細(xì)節(jié);
  • 細(xì)節(jié)應(yīng)該依賴抽象;

這里的抽象指的就是 接口或抽象類 ,細(xì)節(jié)指的是 實(shí)現(xiàn)類

其核心思想是:要面向接口編程,不要面向?qū)崿F(xiàn)編程

為什么面向接口呢?面向接口就是面向抽象,由于在軟件設(shè)計(jì)中,細(xì)節(jié)具有多變性,而 抽象層相對穩(wěn)定 ,因此以抽象為基礎(chǔ)搭建起來的架構(gòu)要比以細(xì)節(jié)為基礎(chǔ)搭建起來的架構(gòu)要穩(wěn)定得多。


依賴倒置原則在 Java 中的表現(xiàn)是:

  • 模塊之間的依賴通過抽象產(chǎn)生,實(shí)現(xiàn)類之間不能發(fā)生依賴關(guān)系,只能通過接口或抽象類產(chǎn)生;
  • 接口或抽象類不依賴于實(shí)現(xiàn)類;
  • 實(shí)現(xiàn)類依賴接口或抽象類;

我們以一個(gè)例子來看一下依賴倒置原則的重要性:

現(xiàn)在有一個(gè)司機(jī),他想開一輛奔馳車。

代碼可以這樣寫:

司機(jī):

public class Driver() {
public void drive(Benz benz) {
benz.run();
}
}

奔馳車:

public class Benz() {
public void run() {
System.out.println("奔馳汽車開始運(yùn)行...");
}
}

主函數(shù):

public class Client() {
public static void main() {
Driver zhangSan = new Driver();
Benz benz = new Benz();
// 張三開奔馳車
zhangSan.drive(benz);
}
}

這樣運(yùn)行起來,可以得到我們想要的結(jié)果,代碼沒有問題。

但是只有當(dāng)需求變更的時(shí)候才能真正的檢驗(yàn)代碼的質(zhì)量。

現(xiàn)在題目要求司機(jī)開寶馬車,怎么改?

我們先創(chuàng)建出來寶馬車:

public class BMW() {
public void run() {
System.out.println("寶馬汽車開始運(yùn)行...");
}
}

寶馬車出來了,但是我們卻沒辦法讓張三將車開動(dòng)起來,為什么?因?yàn)閺埲龥]有開動(dòng)寶馬車的方法啊。

此時(shí)我們發(fā)現(xiàn)我們的系統(tǒng)出現(xiàn)了問題:司機(jī)和奔馳車之間是緊耦合的關(guān)系,司機(jī)是實(shí)體類,奔馳車也是實(shí)體類,他們兩個(gè)發(fā)生了依賴關(guān)系,違背了我們說的依賴倒置原則。

那怎么修改呢?

既然是面向接口,那我們就創(chuàng)建兩個(gè)接口,讓抽象的接口互相依賴:

面向抽象
下面介紹 3 種依賴的類型。

依賴的 3 種寫法

依賴是可以傳遞的,A 對象依賴 B 對象,B 又依賴 C,C 又依賴 D······,但是只要我們做到抽象依賴,即使是多層的依賴傳遞也不怕。

對象的依賴關(guān)系有三種方式來傳遞,分別是:

1、構(gòu)造函數(shù)傳遞依賴對象

public class Driver() {
public void drive(Benz benz) {
benz.run();
}
}

2、Setter 方法傳遞依賴對象

public interface IDriver {
public void setCar(ICar car);
public void drive();
}

3、接口聲明依賴對象

在接口的方法中聲明依賴對象,也叫作接口注入。

public interface IDriver {
public void driver(ICar car);
}

那么我們在項(xiàng)目中怎么使用這個(gè)規(guī)則呢?可以從以下幾個(gè)方面入手:

  1. 每個(gè)類盡量都要有接口或抽象類;
  2. 變量的表面類型盡量是接口或者抽象類;
  3. 任何類都不應(yīng)該從具體類派生;
  4. 集合里式替換原則使用。

我們可以得出一個(gè)通俗的規(guī)則:

  • 接口負(fù)責(zé)定義 public 屬性和方法,并且聲明與其他對象的依賴關(guān)系;
  • 抽象類負(fù)責(zé)公共構(gòu)造部分的實(shí)現(xiàn);
  • 實(shí)現(xiàn)類準(zhǔn)確的實(shí)現(xiàn)業(yè)務(wù)邏輯,同時(shí)對父類進(jìn)行細(xì)化。

四、接口隔離原則

接口隔離原則(Interface Segregation Principle,ISP)要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。

就是要讓接口中的方法盡可能的少而精。

同時(shí)注意,根據(jù)接口隔離原則拆分接口時(shí),首先必須滿足 單一職責(zé)原則 ,不能無限拆分。

例題:學(xué)生成績管理程序。

分析:學(xué)生成績管理程序一般包含插入成績、刪除成績、修改成績、計(jì)算總分、計(jì)算均分、打印成績信息、査詢成績信息等功能,如果將這些功能全部放到一個(gè)接口中顯然不太合理,正確的做法是將它們分別放在輸入模塊、統(tǒng)計(jì)模塊和打印模塊等 3 個(gè)模塊中,其類圖如圖所示。

五、迪米特法則

迪米特法則(Law of Demeter,LoD)又叫作最少知識原則(Least Knowledge Principle,LKP)。

一個(gè)類應(yīng)該對自己需要耦合或調(diào)用的類知道的最少,你的內(nèi)部是如何復(fù)雜都和我沒有關(guān)系,那是你的事情,我就知道你提供那么多 public 方法,我就調(diào)用這么多,其他的我一概不關(guān)心。

先說一下什么是 朋友類

  • 出現(xiàn)在成員變量、方法的輸入輸出參數(shù)中的類稱為成員朋友類;
  • 出現(xiàn)在方法體內(nèi)部的類不屬于朋友類。

迪米特法則的目的就是低耦合,它包含 4 層含義:

1、只和朋友交流

也就是說符合迪米特法則的類中的方法,應(yīng)該不能出現(xiàn)非朋友類,不能和陌生人有交流。

2、朋友之間也是有距離的

人與人之間是有距離的,類與類之間也有距離,不能太過親密。

比如 A 類有 3 個(gè)方法,被 B 類的一個(gè)方法 m1 全部調(diào)用了,這樣一來就會(huì)有一個(gè)問題,當(dāng) A 類修改方法的名稱時(shí),B 類也要修改 m1 方法,這就是耦合太緊了。

解決辦法就是將 m1 方法轉(zhuǎn)移到 A 類中去,讓 B 類調(diào)用 A 的 m1 方法,這樣就是高內(nèi)聚低耦合了。

同時(shí) A 類中的 3 個(gè)方法可以設(shè)置成私有的,因?yàn)橹挥兴约赫{(diào)用,只需要將 m1 設(shè)置成 public 就可以了。

一個(gè)類公開的 public 屬性或方法越多,修改時(shí)涉及的面也就越大,迪米特法則要求類 羞澀 一點(diǎn),盡量內(nèi)斂。

3、是自己的就是自己的

如果一個(gè)方法放在本類中,既不增加類間關(guān)系,也對本類不產(chǎn)生負(fù)面影響,那就放置在本類中。

4、謹(jǐn)慎使用 Serializable


明星與經(jīng)紀(jì)人的關(guān)系實(shí)例。

分析:明星由于全身心投入藝術(shù),所以許多日常事務(wù)由經(jīng)紀(jì)人負(fù)責(zé)處理,如與粉絲的見面會(huì),與媒體公司的業(yè)務(wù)洽淡等。這里的經(jīng)紀(jì)人是明星的朋友,而粉絲和媒體公司是陌生人,所以適合使用迪米特法則,其類圖如圖所示。

明星與經(jīng)紀(jì)人的關(guān)系

六、開閉原則

開閉原則是 Java 世界里最基礎(chǔ)的設(shè)計(jì)原則,它指導(dǎo)我們?nèi)绾谓⒁粋€(gè)穩(wěn)定的、靈活的系統(tǒng)。

他要求軟件實(shí)體應(yīng)該對擴(kuò)展開放,對修改關(guān)閉。

這里的軟件實(shí)體包括:

  • 模塊;
  • 抽象和類;
  • 方法。

前面提到的幾個(gè)原則都是開閉原則的具體形態(tài),也就是說前五個(gè)原則就是指導(dǎo)設(shè)計(jì)的工具和方法,而開閉原則才是精神領(lǐng)袖。

開閉原則 在面向?qū)ο笤O(shè)計(jì)領(lǐng)域中的地位類似于牛頓第一定律在力學(xué)中的地位。


下面以 Windows 的桌面主題為例介紹開閉原則的應(yīng)用。

例題:Windows 的桌面主題設(shè)計(jì)。

分析:Windows 的主題是桌面背景圖片、窗口顏色和聲音等元素的組合。用戶可以根據(jù)自己的喜愛更換自己的桌面主題,也可以從網(wǎng)上下載新的主題。這些主題有共同的特點(diǎn),可以為其定義一個(gè)抽象類(Abstract Subject),而每個(gè)具體的主題(Specific Subject)是其子類。用戶窗體可以根據(jù)需要選擇或者增加新的主題,而不需要修改原代碼,所以它是滿足開閉原則的,其類圖如圖所示。

桌面主題
軟件設(shè)計(jì)最大的難題就是應(yīng)對需求的變化,但是繁雜的需求變化又是不可預(yù)料的。我們要為不可預(yù)料的事情做好準(zhǔn)備,大師們?yōu)槲覀兲峁┝?6 大設(shè)計(jì)原則和 23 種設(shè)計(jì)模式來 封裝 未來的變化。

來源:https://www./content-4-793951.html

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    熟女高潮一区二区三区| 成人午夜激情在线免费观看| 亚洲乱妇熟女爽的高潮片| 免费特黄一级一区二区三区| 亚洲精品美女三级完整版视频| 亚洲一区二区精品福利| 男人大臿蕉香蕉大视频| 日本av一区二区不卡| 国产欧美日韩在线一区二区| 免费黄色一区二区三区| 国产麻豆一区二区三区在| 亚洲一区二区三在线播放| 日韩欧美一区二区黄色| 精品国模一区二区三区欧美| 老熟妇乱视频一区二区| 91人妻人人揉人人澡人| 五月激情综合在线视频| 中文字字幕在线中文乱码二区| 欧美午夜色视频国产精品| 人妻熟女欲求不满一区二区| 国自产拍偷拍福利精品图片| 午夜福利国产精品不卡| 男生和女生哪个更好色| 在线免费观看一二区视频| 日本黄色录像韩国黄色录像| 精品一区二区三区人妻视频| 国产福利在线播放麻豆| 日本午夜免费福利视频| 成人午夜视频在线播放| 扒开腿狂躁女人爽出白浆av| 亚洲中文字幕有码在线观看| 日本成人三级在线播放| 国产精品香蕉在线的人| 国语对白刺激高潮在线视频| 国产剧情欧美日韩中文在线| 国产极品粉嫩尤物一区二区 | 日本一本不卡免费视频| 久久国内午夜福利直播| 午夜国产成人福利视频| 五月婷婷六月丁香在线观看| 欧美性高清一区二区三区视频|