文章目录
- 设计模式
-
- 七大设计原则
-
- 开闭原则
- 里氏替换原则
- 依赖倒置原则
- 接口隔离原则
- 迪米特法则-最少知道原则
- 单一职责原则
- 合成复用原则
设计模式
面向对象的三个基本特征:
- 继承
- 封装
- 多态
设计模式体现了代码的耦合性、内聚性、可维护性、可扩展性、重用性、灵活性。
- 代码重用性:相同功能代码不用多次编写
- 可读性
- 可扩展性:添加新功能非常方便,可维护
- 可靠性:当我们添加新功能不影响原有的功能
- 使程序呈现高内聚、低耦合的特性
七大设计原则
开闭原则
原则:一个软件实体如类、模块、函数应该对拓展开发、对修改关闭
在程序需要拓展的时候,不能去修改原有代码,为了易于维护我们应该更多的学会使用接口和抽象类,在设计的时候尽量适应变化,提高系统的稳定性、灵活性。
场景:书店销售书籍
假如我们想在双十一对书籍进行打折。
实现方案:
-
修改接口:在Book类中新增一个打折接口;但是这样做其他所有实现类都需要改动。
-
修改实现类方法:NovelBook类修改原有的getPrice()方法,实现打折逻辑,但是这样做的话违背了开闭原则,如果双十一过去了是不是还有再把代码回退
-
实现类新增方法:NovelBook类新增getDiscountPrice()方法,这个看起来不错,但是一个类中提供两个获取价格的接口对调用者不是很友好,而且随着业务需求越来越多这个类不断添加新的方法,本来我们设计这个类的目的只是想获取书籍的基本信息,但是现在又混合了很多业务逻辑,那么这个类就违背了单一职责原则。
-
派生出一个打折类:该类继承NovelBook基类,用来专门处理打折逻辑,这样不用修改原有实现类不会对上层调用者产生影响,利用拓展实现功能,其实这种对基类已实现的方法进行覆盖违背了里氏替换原则,如果想不违背里氏替换原则只能在派生类中添加新的方法,并且在基类的方法中添加final保证不会被重写,这里我们只是讲解开闭原则,就不考虑那么多。
引用:https://www.jianshu.com/p/d36da4f136c4
里氏替换原则
原则:所有基类在的地方,都可以换成子类,程序还可以正常运行。这个原则与继承特性密切相关。
相信我们经常用到继承,那你知道继承有哪些优点/p>
- 子类拥有父类的所有方法和属性,从而减少创建类的工作量。
- 提高了代码的重用性。
- 提高了代码的拓展性,子类不但拥有父类的所有功能,还可以添加自己的功能。
缺点:
- 继承是有侵入性的,只要继承,就必须拥有父类的所有属性和方法。
- 降低了代码的灵活性。因为继承时,父类对子类有一种约束。
- 增强了耦合性,当需要对父类的代码进行修改时,必须考虑到对子类产生的影响。
里氏替换原则对继承进行了规则上的约束
- 子类必须实现父类的抽象方法,但不得重写(覆盖)父类的已实现的方法。
- 子类可以增加自己特有的方法。
- 当子类重载父类的方法时,方法的形参要比父类的输入参数更宽松。(只能重载不能重写)
- 当子类的方法实现父类的抽象方法时,方法的返回值要比父类更严格。
约束详细解释:
-
子类必须实现父类的抽象方法,但不得重写(覆盖)父类的已实现的方法。
首先子类必须实现父类的抽象方法,不然编译无法通过;
如果重写父类的方法,当用子类替代父类后会出现意想不到的错误,如果想避免这种问题我们可以将父类不得重写的方法添加final关键字,这样在语法层面就可以避免违反里氏替换原则;
-
子类可以增加自己特有的方法
子类可以对父类功能进行拓展。
-
当子类重载父类的方法时,方法的形参要比父类的输入参数更宽松
定义一个父类利用子类重载run方法如果此时作为参数传入
结果会发现用同一个参数子类和父类调用结果却不同,会出现程序调用混乱,由于子类形参为HashMap导致父类方法没有被重写的情况下调用了子类。
如果我们把子类的形参范围设置的比父类更大就不会出现上述问题。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!