文章目录

  • 一、依赖倒置原则简介
  • 二、面向实现编程代码示例 ( 反面示例 )
    • 1、顾客类
    • 2、测试类
  • 三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )
    • 1、顾客类
    • 2、商品接口
    • 3、冰箱商品
    • 4、电视商品
    • 5、测试类
  • 四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )
    • 1、顾客类
    • 2、商品接口
    • 3、冰箱商品
    • 4、电视商品
    • 5、测试类
  • 五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )
    • 1、顾客类
    • 2、商品接口
    • 3、冰箱商品
    • 4、电视商品
    • 5、测试类

一、依赖倒置原则简介


依赖倒置原则 : 高层模块 不应该 依赖 低层模块 , 二者都应该 依赖其抽象 ;
抽象 不应该 依赖细节 , 细节应该依赖抽象 ;

针对接口编程 , 不要针对实现编程 ;

通过抽象 , 包括使用 接口 或 抽象类 , 使个各类或模块之间 彼此独立 , 互不影响 , 从而实现模块之间的 松耦合 , 降低模块间的耦合性 ;

使用依赖倒置原则时的注意点 :

  • 每个类都 尽量 实现自接口 或 继承抽象类 ;
  • 尽量 避免从具体的类派生 ;
  • 尽量 不要覆盖基类方法 ;

依赖倒置原则的优点 : 减少类之间的 耦合性 , 提高系统 稳定性 , 提高 代码可读性 , 可维护性 , 可 降低修改程序所造成的风险 ;

二、面向实现编程代码示例 ( 反面示例 )


1、顾客类

package dependenceinversion;/*** 如果要增加一个新功能 , 就需要在该类中添加一个新方法*      这就是面向实现编程 , 该实现类需要经常进行修改*      扩展性很差** 应用层的函数 , 是依赖于底层实现的 , 由于没有实现接口*      造成了应用层的测试类 , 直接依赖于本类*      应用层的模块属于高层模块*      本类属于低层模块*      根据依赖倒置原则 , 高层次的模块是不应该依赖于低层次的模块的*/
public class Customer {public void buyFridge() {System.out.println("购买冰箱");}public void buyTelevision() {System.out.println("购买电视");}
}

2、测试类

package dependenceinversion;public class Main {public static void main(String[] args) {Customer customer = new Customer();customer.buyFridge();customer.buyTelevision();}
}

执行结果 :

购买冰箱
购买电视

三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )


1、顾客类

使用接口方法注入 IGood 实现类 ;

package dependenceinversion;public class Customer {/*** 接口方法注入 IGood 实现类*      也可以使用构造函数 , 注入 IGood 实现类** 此处就是面向接口编程*      如果添加了新的类 , 不需要修改本类*      只需要添加新的接口实现类即可*      面向接口编程 , 而不是面向本实现类*      对于高层模块来说 , 具体传入的参数是什么参数 ,*      交给高层模块选择** 本类 与 具体的 IGood 接口 实现 是解耦的*      本类 与 应用层 客户端测试类 之间是解耦的** 如果在添加一个新商品 , 直接定义一个新的接口实现类即可** @param iGood*/public void buy(IGood iGood) {iGood.buy();}
}

2、商品接口

package dependenceinversion;/*** 商品接口*/
public interface IGood {/*** 购买商品*/void buy();
}

3、冰箱商品

package dependenceinversion;/*** 冰箱商品*/
public class FridgeGood implements IGood {@Overridepublic void buy() {System.out.println("购买冰箱");}
}

4、电视商品

package dependenceinversion;/*** 电视商品*/
public class TelevisionGood implements IGood {@Overridepublic void buy() {System.out.println("购买电视");}
}

5、测试类

package dependenceinversion;public class Main {public static void main(String[] args) {Customer customer = new Customer();customer.buy(new FridgeGood());customer.buy(new TelevisionGood());}
}

执行结果 :

购买冰箱
购买电视

四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )


1、顾客类

使用构造函数注入 IGood 实现类 ;

package dependenceinversion;public class Customer {private IGood iGood;/*** 使用构造函数注入 IGood 实现类* @param iGood*/public Customer(IGood iGood) {this.iGood = iGood;}public void buy() {this.iGood.buy();}
}

2、商品接口

package dependenceinversion;/*** 商品接口*/
public interface IGood {/*** 购买商品*/void buy();
}

3、冰箱商品

package dependenceinversion;/*** 冰箱商品*/
public class FridgeGood implements IGood {@Overridepublic void buy() {System.out.println("购买冰箱");}
}

4、电视商品

package dependenceinversion;/*** 电视商品*/
public class TelevisionGood implements IGood {@Overridepublic void buy() {System.out.println("购买电视");}
}

5、测试类

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();}
}

执行结果 :

购买冰箱
购买电视

五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )


1、顾客类

使用 Setter 方法注入 IGood 实现类 ;

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 {/*** 购买商品*/void buy();
}

3、冰箱商品

package dependenceinversion;/*** 冰箱商品*/
public class FridgeGood implements IGood {@Overridepublic void buy() {System.out.println("购买冰箱");}
}

4、电视商品

package dependenceinversion;/*** 电视商品*/
public class TelevisionGood implements IGood {@Overridepublic void buy() {System.out.println("购买电视");}
}

5、测试类

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();}
}

执行结果 :

购买冰箱
购买电视

【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )相关推荐

  1. Java 七大设计原则 - 依赖倒置原则/面向接口编程

    一.什么是依赖倒置原则(Dependence Inversion Principle, DIP) ?  - 面向接口编程(Object-Oriented Design, OOD) (1) 高层模块与低 ...

  2. 设计模式之禅之六大设计原则-依赖倒置原则

    依赖倒置原则 依赖倒置原则的原始定义是: ● 高层模块不应该依赖低层模块,两者都应该依赖其抽象; ● 抽象不应该依赖细节; ● 细节应该依赖抽象. 那什么是抽象?什么又是细节呢? ---->在J ...

  3. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则

    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据 7 条原则来开发程序,从而提高软件开发效率.节约软件开发成本和维护成本. 这 7 种设计原则是软件设计 ...

  4. 设计模式-软件设计七大原则

    目录 综述 1.开闭原则 1.1开闭原则的定义 1.2开闭原则的作用 1.3开闭原则的实现方法 2.里氏替换原则 2.1里氏替换原则的定义 2.2里氏替换原则的作用 2.3里氏替换原则的实现方法 3. ...

  5. java设计模式之设计原则②依赖倒置原则

    定义: ⑴高层模块不应该依赖低层模块,二者都应该依赖其抽象 ⑵抽象不应该依赖细节,细节应该依赖抽象 ⑶针对接口编程,不要针对实现编程 我们通过抽象包括使用接口或者抽象类可以使各个类或模块的实现彼此独立 ...

  6. 设计原则(单一职责原则 开放封闭原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则)

    设计原则 单一职责原则(SRP) 从三大特性角度看原则: 应用的设计模式: 开放封闭原则(OCP) 从三大特性角度看原则: 应用的设计模式: 里氏替换原则(LSP) 从三大特性角度看原则: 应用的设计 ...

  7. 设计模式--6大原则--依赖倒置原则

    依赖倒置原则(Dependence Inversion Principle),简称DIP 定义 High level modules should depend upon low level modu ...

  8. 设计原则——依赖倒置原则

    1.全称 Dependence Inversion Principle 缩写为:DIP 2.解释 高层模块不应该依赖低层模块,两者都应该依赖其抽象:抽象不应该依赖细节,细节应该依赖抽象 其核心思想是: ...

  9. java与模式--里氏代换原则,依赖倒置原则

    一里氏代换原则 1.基类可以出现的地方,子类也可以出现. 2.子类可以替换基类出现的替换,软件的功能行为不改变,则基类可以复用,子类可以扩展基类的功能. 3.例子 <1>正方形继承长方形. ...

最新文章

  1. 正直摄影方式的精度估算式_[公务员考试]数量关系——估算法与直除法
  2. python就业方向哪个好-学习python就业方向都有哪些?
  3. 【合并区间】排序 + 双指针
  4. 信号处理:CTFS-CTFT
  5. PMP之项目整合管理之变更管理计划
  6. iOS NSMutableAttributedString常用方法总结
  7. python ide在哪个文件夹_Python IDE使用汇总
  8. Android 系统(43)---HTTPS
  9. python写sql语句_Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析...
  10. Oct.14 华为数通部算法岗面经
  11. 量化分析(6)——K线图、交易量图、动量图、rsi强度图
  12. 数据库——如何求出候选码
  13. 安卓逆向——AS开发Xposed插件demo案例
  14. 三菱加工中心CNC编程G代码讲解
  15. 遥感在计算机领域的应用,浅谈遥感技术在测绘领域发展应用.doc
  16. windows server:关闭ie增强安全配置
  17. 计算机的网线连接路由器的什么接口,网线插路由器哪个口
  18. 嵌入式开发入门之经典 ARM开发板
  19. 社团课Day2-数据解析:Xpath、BeautifulSoup、re正则表达
  20. 写代码这条路,能走多远?

热门文章

  1. HTTP 304 的理解
  2. IBM RAS:高效存储的优化组合
  3. WF,WPF,Silverlight的DependencyProperty 附加属性
  4. DeepStream开发日志
  5. 201671010436 王雪刚 实验四 《英文文本统计分析》结对项目报告
  6. pre标签 首行会自动换行解决方案
  7. freemarker程序开发
  8. ArcGIS For JavaScript API 默认参数
  9. Linq 入门系列 [OfType,ToArray,ToList,ToDictionary]
  10. 趣谈Linux操作系统学习笔记:用户态内存映射:如何找到正确的会议室?(第25讲)...