【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )
文章目錄
- 一、依賴(lài)倒置原則簡(jiǎn)介
- 二、面向?qū)崿F(xiàn)編程代碼示例 ( 反面示例 )
- 1、顧客類(lèi)
- 2、測(cè)試類(lèi)
- 三、依賴(lài)倒置原則代碼示例 ( 推薦示例 | 使用接口方法注入 IGood 實(shí)現(xiàn)類(lèi) )
- 1、顧客類(lèi)
- 2、商品接口
- 3、冰箱商品
- 4、電視商品
- 5、測(cè)試類(lèi)
- 四、依賴(lài)倒置原則代碼示例 ( 推薦示例 | 使用構(gòu)造函數(shù)注入 IGood 實(shí)現(xiàn)類(lèi) )
- 1、顧客類(lèi)
- 2、商品接口
- 3、冰箱商品
- 4、電視商品
- 5、測(cè)試類(lèi)
- 五、依賴(lài)倒置原則代碼示例 ( 推薦示例 | 使用 Setter 方法注入 IGood 實(shí)現(xiàn)類(lèi) )
- 1、顧客類(lèi)
- 2、商品接口
- 3、冰箱商品
- 4、電視商品
- 5、測(cè)試類(lèi)
一、依賴(lài)倒置原則簡(jiǎn)介
依賴(lài)倒置原則 : 高層模塊 不應(yīng)該 依賴(lài) 低層模塊 , 二者都應(yīng)該 依賴(lài)其抽象 ;
抽象 不應(yīng)該 依賴(lài)細(xì)節(jié) , 細(xì)節(jié)應(yīng)該依賴(lài)抽象 ;
針對(duì)接口編程 , 不要針對(duì)實(shí)現(xiàn)編程 ;
通過(guò)抽象 , 包括使用 接口 或 抽象類(lèi) , 使個(gè)各類(lèi)或模塊之間 彼此獨(dú)立 , 互不影響 , 從而實(shí)現(xiàn)模塊之間的 松耦合 , 降低模塊間的耦合性 ;
使用依賴(lài)倒置原則時(shí)的注意點(diǎn) :
- 每個(gè)類(lèi)都 盡量 實(shí)現(xiàn)自接口 或 繼承抽象類(lèi) ;
- 盡量 避免從具體的類(lèi)派生 ;
- 盡量 不要覆蓋基類(lèi)方法 ;
依賴(lài)倒置原則的優(yōu)點(diǎn) : 減少類(lèi)之間的 耦合性 , 提高系統(tǒng) 穩(wěn)定性 , 提高 代碼可讀性 , 可維護(hù)性 , 可 降低修改程序所造成的風(fēng)險(xiǎn) ;
二、面向?qū)崿F(xiàn)編程代碼示例 ( 反面示例 )
1、顧客類(lèi)
package dependenceinversion;/*** 如果要增加一個(gè)新功能 , 就需要在該類(lèi)中添加一個(gè)新方法* 這就是面向?qū)崿F(xiàn)編程 , 該實(shí)現(xiàn)類(lèi)需要經(jīng)常進(jìn)行修改* 擴(kuò)展性很差** 應(yīng)用層的函數(shù) , 是依賴(lài)于底層實(shí)現(xiàn)的 , 由于沒(méi)有實(shí)現(xiàn)接口* 造成了應(yīng)用層的測(cè)試類(lèi) , 直接依賴(lài)于本類(lèi)* 應(yīng)用層的模塊屬于高層模塊* 本類(lèi)屬于低層模塊* 根據(jù)依賴(lài)倒置原則 , 高層次的模塊是不應(yīng)該依賴(lài)于低層次的模塊的*/ public class Customer {public void buyFridge() {System.out.println("購(gòu)買(mǎi)冰箱");}public void buyTelevision() {System.out.println("購(gòu)買(mǎi)電視");} }
2、測(cè)試類(lèi)
package dependenceinversion;public class Main {public static void main(String[] args) {Customer customer = new Customer();customer.buyFridge();customer.buyTelevision();} }
執(zhí)行結(jié)果 :
購(gòu)買(mǎi)冰箱 購(gòu)買(mǎi)電視三、依賴(lài)倒置原則代碼示例 ( 推薦示例 | 使用接口方法注入 IGood 實(shí)現(xiàn)類(lèi) )
1、顧客類(lèi)
使用接口方法注入 IGood 實(shí)現(xiàn)類(lèi) ;
package dependenceinversion;public class Customer {/*** 接口方法注入 IGood 實(shí)現(xiàn)類(lèi)* 也可以使用構(gòu)造函數(shù) , 注入 IGood 實(shí)現(xiàn)類(lèi)** 此處就是面向接口編程* 如果添加了新的類(lèi) , 不需要修改本類(lèi)* 只需要添加新的接口實(shí)現(xiàn)類(lèi)即可* 面向接口編程 , 而不是面向本實(shí)現(xiàn)類(lèi)* 對(duì)于高層模塊來(lái)說(shuō) , 具體傳入的參數(shù)是什么參數(shù) ,* 交給高層模塊選擇** 本類(lèi) 與 具體的 IGood 接口 實(shí)現(xiàn) 是解耦的* 本類(lèi) 與 應(yīng)用層 客戶端測(cè)試類(lèi) 之間是解耦的** 如果在添加一個(gè)新商品 , 直接定義一個(gè)新的接口實(shí)現(xiàn)類(lèi)即可** @param iGood*/public void buy(IGood iGood) {iGood.buy();} }2、商品接口
package dependenceinversion;/*** 商品接口*/ public interface IGood {/*** 購(gòu)買(mǎi)商品*/void buy(); }
3、冰箱商品
package dependenceinversion;/*** 冰箱商品*/ public class FridgeGood implements IGood {@Overridepublic void buy() {System.out.println("購(gòu)買(mǎi)冰箱");} }
4、電視商品
package dependenceinversion;/*** 電視商品*/ public class TelevisionGood implements IGood {@Overridepublic void buy() {System.out.println("購(gòu)買(mǎi)電視");} }
5、測(cè)試類(lèi)
package dependenceinversion;public class Main {public static void main(String[] args) {Customer customer = new Customer();customer.buy(new FridgeGood());customer.buy(new TelevisionGood());} }
執(zhí)行結(jié)果 :
購(gòu)買(mǎi)冰箱 購(gòu)買(mǎi)電視四、依賴(lài)倒置原則代碼示例 ( 推薦示例 | 使用構(gòu)造函數(shù)注入 IGood 實(shí)現(xiàn)類(lèi) )
1、顧客類(lèi)
使用構(gòu)造函數(shù)注入 IGood 實(shí)現(xiàn)類(lèi) ;
package dependenceinversion;public class Customer {private IGood iGood;/*** 使用構(gòu)造函數(shù)注入 IGood 實(shí)現(xiàn)類(lèi)* @param iGood*/public Customer(IGood iGood) {this.iGood = iGood;}public void buy() {this.iGood.buy();} }2、商品接口
package dependenceinversion;/*** 商品接口*/ public interface IGood {/*** 購(gòu)買(mǎi)商品*/void buy(); }
3、冰箱商品
package dependenceinversion;/*** 冰箱商品*/ public class FridgeGood implements IGood {@Overridepublic void buy() {System.out.println("購(gòu)買(mǎi)冰箱");} }
4、電視商品
package dependenceinversion;/*** 電視商品*/ public class TelevisionGood implements IGood {@Overridepublic void buy() {System.out.println("購(gòu)買(mǎi)電視");} }
5、測(cè)試類(lèi)
package dependenceinversion;public class Main {public static void main(String[] args) {Customer customer = new Customer(new FridgeGood());customer.buy();Customer customer2 = new Customer(new TelevisionGood());customer2.buy();} }
執(zhí)行結(jié)果 :
購(gòu)買(mǎi)冰箱 購(gòu)買(mǎi)電視五、依賴(lài)倒置原則代碼示例 ( 推薦示例 | 使用 Setter 方法注入 IGood 實(shí)現(xiàn)類(lèi) )
1、顧客類(lèi)
使用 Setter 方法注入 IGood 實(shí)現(xiàn)類(lèi) ;
package dependenceinversion;public class Customer {private IGood iGood;public void setiGood(IGood iGood) {this.iGood = iGood;}public void buy() {this.iGood.buy();} }2、商品接口
package dependenceinversion;/*** 商品接口*/ public interface IGood {/*** 購(gòu)買(mǎi)商品*/void buy(); }
3、冰箱商品
package dependenceinversion;/*** 冰箱商品*/ public class FridgeGood implements IGood {@Overridepublic void buy() {System.out.println("購(gòu)買(mǎi)冰箱");} }
4、電視商品
package dependenceinversion;/*** 電視商品*/ public class TelevisionGood implements IGood {@Overridepublic void buy() {System.out.println("購(gòu)買(mǎi)電視");} }
5、測(cè)試類(lèi)
package dependenceinversion;public class Main {public static void main(String[] args) {Customer customer = new Customer();customer.setiGood(new FridgeGood());customer.buy();customer.setiGood(new TelevisionGood());customer.buy();} }
執(zhí)行結(jié)果 :
購(gòu)買(mǎi)冰箱 購(gòu)買(mǎi)電視總結(jié)
以上是生活随笔為你收集整理的【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【设计模式】软件设计七大原则 ( 开闭原
- 下一篇: 【设计模式】软件设计七大原则 ( 接口隔