1. 程式人生 > >軟體工程六大設計原則總結,案例演示

軟體工程六大設計原則總結,案例演示

目錄

  • 一、單一職責原則
  • 二、介面隔離原則
  • 三、依賴倒轉原則
  • 四、里氏替換原則
  • 五、開閉原則
  • 六、迪米特原則
  • 七、設計原則總結
  • 八、原始碼地址

本文原始碼:GitHub·點這裡 || GitEE·點這裡

一、單一職責原則

1、概念描述

對類來說的,即一個類應該只負責一項職責。如果一個類負責兩個職責,可能存在職責1變化,引起職責2變化的情況。可以基於抽象邏輯,或者業務邏輯對類進行細化。

2、案例演示

這裡基於方法和類的細化都可以,可以根據實際業務選擇。

class Animal {
    public void dogVoice (){
        System.out.println("狗叫聲:旺旺");
    }
    public void cowVoice (){
        System.out.println("牛叫聲:哞哞");
    }
}
class DogVoice {
    public String getDogVoice (){
        return "旺旺" ;
    }
}
class CowVoice {
    public String getCowVoice (){
        return "哞哞" ;
    }
}

3、注意事項

減少程式碼一處變更引起的程式大規模改動情況,降低類的複雜度,提高類的可讀性,可維護性。通常情況下,需要遵守單一職責原則,可以適當違反單一職責原則。

二、介面隔離原則

1、概念描述

客戶端不應該依賴它不需要的介面,一個類對另一個類的依賴,應該建立在最小的介面上。

2、案例演示

interface ReadBlog {
    String getBlog () ;
}
interface AdminBlog {
    Boolean insertBlog () ;
    Boolean updateBlog () ;
    Boolean deleteBlog () ;
}
/**
 * 讀者只開放部落格閱讀介面
 */
class Reader implements ReadBlog {
    @Override
    public String getBlog() {
        return null;
    }
}
/**
 * 管理員有部落格全部的管理許可權
 */
class AdminUser implements AdminBlog,ReadBlog {
    @Override
    public String getBlog() {
        return null;
    }
    @Override
    public Boolean insertBlog() {
        return null;
    }
    @Override
    public Boolean updateBlog() {
        return null;
    }
    @Override
    public Boolean deleteBlog() {
        return null;
    }
}

3、注意事項

介面的設計粒度越小,則應用系統程式越靈活,程式變得靈活也就意味同時結構複雜性提高,開發開發和理解的難度也會變大,可維護性降低。

三、依賴倒轉原則

1、概念描述

高層模組不應該依賴低層模組,兩者應依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象;中心思想是面向介面程式設計。

2、案例演示

public class C01_FarmFactory {
    public static void main(String[] args) {
        Animal animal = new Dog() ;
        FarmFactory farm = new Farming() ;
        farm.breed(animal) ;
        animal = new Pig() ;
        farm.breed(animal) ;
    }
}
/**
 * 介面宣告依賴物件
 */
interface FarmFactory {
    void breed (Animal animal) ;
}
class Farming implements FarmFactory {
    @Override
    public void breed(Animal animal) {
        System.out.println("農場飼養:"+animal.getAnimalName());
    }
}
interface Animal {
    String getAnimalName () ;
}
class Dog implements Animal {
    @Override
    public String getAnimalName() {
        return "牧羊犬";
    }
}
class Pig implements Animal {
    @Override
    public String getAnimalName() {
        return "土豬一號";
    }
}

3、注意事項

相對於系統開發的多變性,抽象的相對穩定。以抽象為基礎搭建的架構比以細節為基礎的架構要穩定靈活。下層模組儘量都要有抽象類或介面,程式穩定性更好。變數的宣告型別儘量是抽象類或介面,這樣變數引用和實際物件之間存在一個過渡空間,利於程式擴充套件和優化。

四、里氏替換原則

1、概念描述

假設如下場景:

  • 存在,一個型別T1,和例項的物件O1
  • 存在,一個型別T2,和例項的物件O2

如果將所有型別為T1的物件O1都替換成型別T2的物件O2,程式的行為不發生改變。那麼型別T2是型別T1的子型別。換句話說,所有引用基類的地方必須能透明地使用其子類的物件。

2、案例演示

public class C01_Calculate {
    public static void main(String[] args) {
        BizCalculate bizCalculate = new BizCalculate() ;
        System.out.println(bizCalculate.add(2,3));
    }
}
class Calculate { }
class BaseCalculate extends Calculate {
    public int add (int a,int b){
        return a+b;
    }
}
/**
 * 這裡使用組合的方式完成計算
 */
class BizCalculate extends Calculate {
    private BaseCalculate baseCalculate = new BaseCalculate() ;
    public int add (int a,int b){
        return this.baseCalculate.add(a,b);
    }
}

3、注意事項

使用繼承時,遵循里氏替換原則,在子類中儘量不要重寫父類的方法;子類可以擴充套件父類的功能,但不能改變原有父類的功能;在適當的情況下,可以通過聚合,組合,依賴等方式解決問題。

五、開閉原則

1、概念描述

開閉原則是程式設計中最基礎、最重要的設計原則,在程式碼結構的設計設計時,應該考慮對擴充套件開放,對修改關閉,抽象思維搭建結構,具體實現擴充套件細節。

2、案例演示

public class C01_BookPrice {
    public static void main(String[] args) {
        ParityBook parityBook = new DiscountBook("Java",100.00) ;
        System.out.println(parityBook.getPrice());
    }
}
interface Book {
    String getName () ;
    Double getPrice () ;
}
/**
 * 平價書籍
 */
class ParityBook implements Book {
    private String name ;
    private Double price ;
    public ParityBook(String name, Double price) {
        this.name = name;
        this.price = price;
    }
    @Override
    public String getName() {
        return this.name ;
    }
    @Override
    public Double getPrice() {
        return this.price ;
    }
}
/**
 * 打折資料擴充套件價格計算策略
 */
class DiscountBook extends ParityBook {
    public DiscountBook(String name, Double price) {
        super(name, price);
    }
    @Override
    public Double getPrice() {
        double oldPrice = super.getPrice();
        return oldPrice * 0.8 ;
    }
}

3、注意事項

基於開閉原則設計的程式碼結構可以提高複用性和可維護性,通過介面或抽象類可以約束類的變化行為,基於指定策略對變化行為進行封裝,並且能夠實現對擴充套件開放,使用設計模式的基本原則就是遵循開閉原則。

六、迪米特原則

1、概念描述

迪米特原則又叫最少知道原則,即一個類對自己依賴的類知道的越少越好。也就是說,對於被依賴的類不管多麼複雜,都儘量將邏輯封裝在類的內部。對外除了提供的public方法,不對外開放任何資訊。類與類關係越密切,耦合度越大,耦合的方式很多,依賴,關聯,組合,聚合等。

  • 直接朋友概念

兩個物件之間有耦合關係,就說這兩個物件之間是朋友關係。其中出現成員變數,方法引數,方法返回值中的類稱為直接朋友,而出現在區域性變數中的類不是直接朋友。從原則上說,陌生的類最好不要以區域性變數的形式出現在類的內部。

2、案例演示

public class C01_Employee {
    public static void main(String[] args) {
        HeadCompanyEmpManage empManage = new HeadCompanyEmpManage() ;
        BranchCompanyEmpManage branchEmp = new BranchCompanyEmpManage() ;
        empManage.printEmp(branchEmp);
    }
}
/**
 * 總公司員工
 */
class HeadCompanyEmp {
    public String name ;
    public HeadCompanyEmp(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "HeadCompanyEmp{name='" + name + '}';
    }
}
/**
 * 分公司員工
 */
class BranchCompanyEmp {
    public String name ;
    public BranchCompanyEmp(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "BranchCompanyEmp{name='" + name + '}';
    }
}
/**
 * 分公司員工管理
 */
class BranchCompanyEmpManage {
    // 新增分公司員工
    public List<BranchCompanyEmp> addEmp (){
        List<BranchCompanyEmp> list = new ArrayList<>() ;
        for (int i = 1 ; i <= 3 ; i++){
            list.add(new BranchCompanyEmp("分公司員工"+i)) ;
        }
        return list ;
    }
    // 獲取分公司員工
    public void printBranchCompanyEmp (){
        List<BranchCompanyEmp> list = addEmp () ;
        for (BranchCompanyEmp emp:list){
            System.out.println(emp);
        }
    }
}
/**
 * 總公司員工管理,基於迪米特原則,不出現陌生類
 */
class HeadCompanyEmpManage {
    // 新增總公司員工
    public List<HeadCompanyEmp> addHeadEmp (){
        List<HeadCompanyEmp> list = new ArrayList<>() ;
        for (int i = 1 ; i <= 3 ; i++){
            list.add(new HeadCompanyEmp("總公司員工"+i)) ;
        }
        return list ;
    }
    public void printEmp (BranchCompanyEmpManage empManage){
        // 列印分公司員工
        empManage.printBranchCompanyEmp();
        List<HeadCompanyEmp> headEmpList = addHeadEmp () ;
        for (HeadCompanyEmp headCompanyEmp:headEmpList){
            System.out.println(headCompanyEmp);
        }
    }
}

3、注意事項

迪米特原則的初衷是降低類之間的耦合,由於每個類都減少了不必要的依賴,因此可以降低耦合關係。降低耦合關係,並不是要求完全沒有依賴關係,過度的使用迪米特原則,容易產生大量的中間類,導致複雜度變大。所以在使用迪米特原則時要根據實際業務權衡。

七、設計原則總結

設計模式和設計原則的核心思想都是:判斷業務應用中可能會變化模組,並且把這些模組獨立出來,基於指定的策略進行封裝,不要和那些變化的不大的模組耦合在一起,封裝思想上基於介面和抽象類,而不是針對具體的實現程式設計。核心目的就是降低互動物件之間的鬆耦合度。設計模式和原則都不是可以生搬硬套的公式,個人理解:只要形似,神韻就自然不差。

八、原始碼地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

相關推薦

軟體工程六大設計原則總結案例演示

目錄 一、單一職責原則 二、介面隔離原則 三、依賴倒轉原則 四、里氏替換原則 五、開閉原則 六、迪米特原則 七、設計原則總結 八、原始碼地址

六大設計原則里氏替換原則

我們都知道繼承是面嚮物件語言中極其重要的一部分語法,當然他的存在給了我們很大的便利,但是同樣他也有很多的缺陷。 繼承是侵入性的,只要繼承,就必須擁有父類的所有屬性和方法; 降低了程式碼的靈活性。子類必須擁有父類的屬性和方法,上子類多了很多的約束; 增強了耦合

php設計模式之六大設計原則

更多 設計原則 其他 使用 重載 以及 陌生人 模式 blog 1.單一職責 定義:不要存在多於一個導致類變更的原因。通俗的說,即一個類只負責一項職責。 場景:類T負責兩個不同的職責:職責P1,職責P2。當由於職責P1需求發生改變而需要修改類T時

設計模式之禪》之——六大設計原則解讀

面向對象 文件 引用 serial 輸出 ble 實例化 客戶 壟斷 一、單一職責原則(Single Responsibility Principle,SRP) 1. 單一職責原則定義 應該有且僅有一個原因引起類的變更。 2. 單一職責原則好處 類的復雜性降低,

六大設計原則

依賴倒置原則 所有 關聯 獨立 拆分 只有一個 迪米特 底層 應該 1、單一職責原則 定義:導致類變更的原因只有一個,就是一個類只做一件事情。 2、裏氏替換原則 定義:所有引用基類的地方都可以使用其子類。 使用:在擴展功能時,當使用繼承解決問題時,子類盡量不要重寫或重載父類

設計模式學習之六大設計原則-1

一、設計模式(Design Pattern)的簡述 定義:設計模式是一套面向物件的程式碼經驗總結,是在程式設計領域被反覆使用、被多數人知曉而且經過分類整理的程式碼設計方法。 目的:為了可重用性程式碼、讓程式碼更容易被他人理解、保證程式碼的可靠性。 理論奠基人:GoF(Gang of Fo

設計模式之六大設計原則之《一》魔性的單一職責原則

定義:單一職責原則,英文全稱Single Responsbility Property。怎樣的類設計才稱的上符合單一職責原則呢?一句話:應該有且僅有一個原因引起類的變更(There should never be more than one reason for a class to chang

Java設計模式——(一):六大設計原則

單一職責原則 里氏替換原則 依賴倒置原則 介面隔離原則 迪米特法則 開閉原則 注:準備系統學習一下Java的23種開發模式,由於Java的開發模式是根據六大設計原則設計的,所以有必要認真學一下Java的六大設計原則(圖片來源於網路,侵刪)

設計模式的六大設計原則

轉載自《一位10年Java工作經驗的架構師聊Java和工作經驗》作者:黃勇,連結(非原始):https://www.cnblogs.com/Gandy/p/7561096.html 瞭解設計模式的朋友們,想必都聽說過“六大設計原則”吧。其實最經典的 23 種設計模式中或多或少

6大設計原則總結

單一職責原則 單一職責原則的目標是類,通過設計介面,使得類從功能上更加純粹,只有一種職責。 這樣設計介面後,整體會更加清晰明瞭,條理分明。不會有混亂的感覺。 里氏替換原則 總結起來很簡單,父

六大設計原則之DIP

目錄 1.簡介 2.定義 3.依賴 4.舉例 1.簡介 依賴倒置原則(Dependence Inversion Principle),簡稱DIP。 2.定義 高層模組不應該依賴於低層模組,兩者都應該依賴其抽象。抽象不應該依賴細節。細節應該依賴抽象。

JAVA設計模式之六大設計原則

在程式設計中,我們通常要遵循以下六大原則: 單一職責原則 官方定義: 就一個類(介面、結構體、方法等等)而言,有且僅有一個引起它變化的原因。 個人理解: 通俗的來講做一件事就是專注做一件事,不可以三心二意。任務物件只是專注於一項職責,不去承擔太多的責

設計模式常用設計原則總結

一、單一職責原則(SRP) 就一個類而言,應該僅有一個引起它變化的原因。 舉個栗子 俄羅斯方塊,下落,旋轉,碰撞判斷,移動,堆積遊戲邏輯可以在不同平臺複用,介面和遊戲邏輯要分離。 總結 如果一個類承擔的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能消弱

通俗易懂-六大設計原則

title: 通俗易懂-六大設計原則 tags: 設計模式 categories: 設計模式 有需求,就會有滿足需求的技術誕生,設計模式官方點講,就是為了程式碼可重複性.讓程式碼更容易被他人理解,保證程式碼的可靠性,通俗點講,為了少寫程式碼而多寫程式碼

軟體工程(終)總結

終於把軟體工程看完了、後邊看的這個迷糊…………也許是因為看了大概一個月的原因、後面的也不想畫導圖了……隨便總結下吧 軟體質量管理 現在買東西都要質量好、軟體也不例外、軟體的質量高就是出錯頻率的高低、

六大設計原則【單一職責】【里氏替換】【 迪米特法則】

設計模式:面嚮物件語言開發過程中,遇到種種的場景和問題,提出的解決方案和思路,沉澱下來,設計模式是解決具體問題的套路 設計模式六大原則:面嚮物件語言開發過程中,推薦的一些指導性原則,這些是沒有明確的招數的,而且也經常被忽視或者違背!   一:單一職責原則(Single Responsibili

以C/C++語法淺談六大設計原則(一)——依賴倒置原則(Dependence Inversion Principle)

一. 前言 眾所周知,在軟體開發過程中,我們的六大設計原則與二十三種設計模式可以說是我們開發的思想精髓。然而,網上或者書本大多數的資料都是以java、python等其他語言語法進行介紹與闡述,很少有以C/C++的語法進行深入介紹。鑑於此,本人以淺薄的見識對這些精妙的思想做以總結,方便

軟體工程概要設計文件模型

1.引言 1.1編寫目的 【闡明編寫概要設計說明書的目的,指明讀者物件。】 1.2專案背景 【應包括: a.專案的委託單位、開發單位和主管部門; b.該軟體系統與其他系統的關係。】 1.3定義 【列出本文件中所用到的專門術語的定義和縮寫詞的原文。】 1.4參考資料 【列出

[Code Design] 六大設計原則之`迪米特法則`

目錄 六大設計原則之`迪米特法則` 迪米特法則 總結 REFRENCES 更多 六大設計原則之迪米特法則 定義 迪米特法則(Law of Demeter)又叫作最少知識原則(Le

[Code Design] 六大設計原則之`開閉原則`

目錄 六大設計原則之`開閉原則` 什麼是開閉原則 為什麼使用開閉原則 如何使用開閉原則 注意事項 總結 REFRENCES 更多 六大設計原則之開閉原則 定義