设计模式六大原则之里氏替换原则、依赖倒置原则详解
设计模式六大原则——里氏替换原则、依赖倒置原则详解
1、里氏代换原则(Liskov Substitution Principle)
概念
顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现抽象和实现父子类相互替换的原则,是面向对象设计的基本原则之一
内容
示例源代码:
Animal抽象类:
public abstract class Animal{//抽象方法public abstract void eat();
}
House子类:
public class Horse extends Animal{@Overridepublic void eat() {System.out.println("马吃草");}//因为参数与父类不同,所以也是特有方法public void eat(String food) {System.out.println("马吃" + food);}
}
Bird子类源码:
public class Horse extends Animal{//继承父类的方法public void eat() {System.out.println("鸟吃食");}//自己特有的方法public void fly() {System.out.println("鸟在飞");}
}
LSPTest测试类:
public class LSPTest {public static void main(String[] args) {//声明基类对象Animal animal;//使用基类指向子类animal = new Horse();animal.eat();//使用基类指向子类animal = new Bird();animal.eat();//Horse horse = new Animal(); 错误}
}
其包含了如下四种准则:
- 子类必须完全实现父类的方法
- 子类可以有自己特有的方法
- 子类的输入参数是父类输入参数的子类或者与之一致
- 子类的返回类型是父类返回类型的子类或与之一致
总结
继承的优点:
- 减少创建类的工作量,因为每个子类都具有父类的属性和方法;
- 提高了代码的重用性
- 提高了可扩展性,因为子类可以有自己独特的方法和属性。
当然,继承也存在缺点:
- 继承具有入侵性,降低了代码的灵活性,因为继承后,不管愿不愿意都要拥有父类的方法和属性
- 增加了耦合,一旦父类发生变动,所有子类就相当于都被发生变动了
2、依赖倒置原则(Dependence Inversion Principle)
概念
传统的设计方法倾向于高层次模块依赖低层次模块,抽象层次依赖具体层次。而“倒置原则”将这个错误纠正了过来,由此命名为“依赖倒置原则”。
其包含了三层含义:
- 高层次模块不应该依赖底层模块,两者都依赖其抽象类
- 抽象不依赖细节
- 细节应该依赖于抽象
在java中的表现:
- 模块间的依赖通过抽象产生,实现类之间不直接发生依赖关系,其依赖关系是通过接口或者抽象类产生
- 接口或抽象类不依赖实现类,实现类依赖于接口或抽象类
内容
通俗的说,依赖倒置原则就是“面向接口编程”——OOD(Object - Oriented Design)的精髓之一。
下面是图解:
不难看出,依赖倒置的本质是通过抽象(接口或抽象类)使各个类或模块的实现实现彼此独立,互不影响,实现模块间的松耦合。
总结
- 每个类都应具有接口或抽象类,或者同事具备抽象类和接口,这是依赖倒置的前提条件,有了抽象才可以依赖倒置
- 任何类型都不应该从具体类派生,即应该从抽象类或接口派生
- 尽量不要重写基类的方法
- 要结合里氏替换原则(继承规范)来使用
设计模式六大原则之里氏替换原则、依赖倒置原则详解相关推荐
- php 倒置,PHP依赖倒置案例详解
这次给大家带来PHP依赖倒置案例详解,PHP依赖倒置的注意事项有哪些,下面就是实战案例,一起来看一下. 什么是依赖倒置呢?简单地讲就是将依赖关系倒置为依赖接口,具体概念如下: 1.上层模块不应该依赖于 ...
- 设计模式初探之设计模式六大原则(3):依赖倒置原则
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一 ...
- java solid设计原则_六大设计原则之里氏替换原则(LSP)
一.SOLID 设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substit ...
- 2016-12-28 迪米特法则+依赖倒转原则+里氏替换原则
依赖倒转原则 依赖倒转原则,也翻译成依赖倒置原则,抽象不应该依赖细节,细节应该依赖于抽象,要针对接口编程,而不是对实现编程.如电脑中无论主板.CPU.内存.硬盘都是针对接口设计的,PC电脑硬件的发展, ...
- 设计模式:依赖倒置原则
依赖倒置原则定义 依赖倒置原则(Dependence Inversion Principle ,DIP)定义如下: High level modules should not depend upon ...
- 设计模式系列:依赖倒置原则
问题由来 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类A一般是高层模块,负责复杂的业务逻辑:类B和类C是低层模块,负责基本的原子操作:假如修 ...
- JAVA【设计模式】依赖倒置原则
依赖倒置原则 一.设计模式的规范 二.依赖倒置原则 三.示例 非依赖倒置原则(硬编码) 依赖倒置原则 UML关系图 一.设计模式的规范 设计模式遵循六⼤原则:单⼀职责( ⼀个类和⽅法只做⼀件事 ).⾥ ...
- 设计模式-依赖倒置原则
依赖倒置原则 1 依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP)这个名字看着有点别扭,"依赖"还"倒置" ...
- php 依赖倒置原则,依赖倒置原则 - LieBrother的个人空间 - OSCHINA - 中文开源技术交流社区...
个人博客原文: 依赖倒置原则 设计模式六大原则之三:依赖倒置原则. 简介 姓名 :依赖倒置原则 英文名 :Dependence Inversion Principle 价值观 :大男子主义的典型代表, ...
- 深入理解依赖倒置原则(Dependence Inversion Principle)
Dependence Inversion Principle 依赖倒置原则(Dependence Inversion Principle) What 什么是依赖倒置原则? Why 为什么使用依赖倒置原 ...
最新文章
- BZOJ5102:[POI2018]Prawnicy(贪心,堆)
- db2 日期英式写法_《学霸英语》16:美国人和英国人“表达日期”,差距竟然这么大!...
- u-boot之怎么实现分区
- html表单没有csrf保护,如何在Symfony 1.4中为表单禁用CSRF保护/验证
- php控制器是啥,控制器的定义
- 题目:16版.雇员的工作职责(一)
- C#学习笔记(十一):类和对象
- Picasso源码阅读笔记六
- LeetCode Closest Binary Search Tree Value II
- linux php 入侵,入侵linux教程 - 冷漠 ' Blog - Focus on Information Security !
- Mybatis之分表设计与分表插入
- vs如何包含库文件以及头文件
- 用python解方程和微积分
- 计算机鼠标老跳动,电脑鼠标总跳是怎么回事?
- python 学生编程--3 多彩同心圆
- 《云计算安全体系》之虚拟化安全读后总结
- 计算机在保险的应用,浅谈计算机信息系统在医疗保险中的应用
- Camera2 YUV_420_888转NV21
- HTML5游戏化互动学习平台,h5游戏平台_触摸型互动slg黄油手游
- 科普丨机器学习翻译和谷歌翻译算法