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