更新時間:2022-04-11 10:41:45 來源:動力節點 瀏覽894次
面向對象設計的原則是什么?動力節點小編來告訴你。
SRP 要求一個類應該只有一個職責。
示例:如果一個類SalesOrder 保存有關銷售訂單的信息,并且另外有一個saveOrder()將其保存SaleOrder 在數據庫中的方法和一個exportXML() 導出的方法,那么SalesOrder這種設計將違反 SRP,因為會有不同類型的用戶類以及對此類進行更改的不同原因。對一種類型的用戶進行的更改,比如更改數據庫的類型,可能需要為其他類型的用戶重新測試、重新編譯和重新鏈接該類。
更好的設計是讓SalesOrder 類只保存有關銷售訂單的信息,并有不同的類分別保存訂單和導出訂單。這樣的設計將得到 SRP 的證實。
OCP 要求每個軟件實體應該對擴展開放,對修改關閉。
示例: 假設一個OrderValidation 類有一個方法validate(Order order)被編程為根據一組硬編碼規則驗證訂單。這種設計違反了 OCP,因為如果規則發生變化,則OrderValidation必須修改、測試和編譯類。
更好的設計是讓OrderValidation 類包含一個對象集合,ValidationRule 每個對象都有一個validate(Order order)方法(可能在Validation 接口中定義)來驗證Order使用特定規則的方法,并且類的validate(Order order)方法OrderValidation 可以簡單地遍歷這些ValidationRule對象以驗證順序. 新設計將滿足 OCP,因為如果規則發生變化,我們可以創建一個新ValidationRule 對象并在運行時將其添加到OrderValidation實例中(而不是添加到類定義本身)。
這也可以通過使用AbstractValidationRule具有可覆蓋功能的基類的子類來實現validate(Order order)。子類可以在不改變基類功能的情況下以不同的方式實現該方法。
LSP 要求程序中的對象應該可以用它們的子類的實例替換而不改變該程序的正確性。
用戶必須能夠通過對基類的引用來使用子類的對象,而不會注意到任何區別。當通過其基類接口使用對象時,子類的對象不能期望用戶遵守比基類要求的更強大的先決條件。
示例:假設一個Rectangle 類有兩個實例變量height和width,以及一個方法,setSize(int a, int b)該方法設置height 為a和width。b假設Square是 的子類, 和為 來Rectangle 覆蓋繼承的方法。這種設計會違反 LSP。要看到這一點,請考慮客戶端使用類型的引用變量調用 方法來分配不同的值和,然后立即驗證是否正確設置了大小或正確計算了面積。如果變量引用heightwidthaRectanglesetSize()abRectangle對象而不是 Square對象。
事實證明,在 OO 編程中, aSquare 根本不是 a Rectangle,因為它的行為與 a 不同Rectangle。
ISP 要求客戶端不應被迫依賴他們不使用的接口。
示例:假設圖中所示的 Vehicle 接口是為客戶設計的
這違反了 ISP,因為客戶端被迫依賴于他們不使用的方法:HighWay不使用stopRadio() or ejectCD(),并且ParkingLot不需要accelerate()or ejectCD()。
更好的設計是為不同類型的客戶端設計更小的接口,如下圖所示
DIP 要求高層模塊不應該依賴于低層模塊,兩者都應該依賴于Java抽象類。另外,抽象不應該依賴于細節,細節應該依賴于抽象。
示例:使一個類Button 與另一個 Lamp(因為 aLamp 有 aButton)違反了 DIP。更好的設計是將 AbstractButton 與 AbstractButtonClient 相關聯,并將 Button 定義為 AbstractButton 的子類,將 Lamp 定義為 AbstractButtonClient 的子類。
示例:EBookReader 使用classPDFBook是違反DIP的,因為它需要更改EBookReader class才能閱讀其他類型的電子書。一個更好的設計是讓EBookReader 使用一個接口EBook并讓PDFBook 其他類型的電子書類實現EBook。現在添加或更改電子書課程將不需要對EBookReader 課程進行任何更改。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習