《设计模式》-02-面向对象的设计原则(单一职责,开放、闭合原则,接口隔离原则,依赖倒置原则,liskov替换原则,代码缺陷)

本文详细介绍了面向对象设计的五个核心原则:单一职责原则强调类应有单一职责;开放/闭合原则提倡对扩展开放、对修改关闭;接口隔离原则主张接口应按业务分组;依赖倒置原则提倡依赖于抽象而非具体实现;Liskov替换原则确保子类可以替换父类而不影响系统。遵循这些原则能提高代码的稳定性和可维护性,但过度使用可能增加复杂性和抽象度。
摘要由CSDN通过智能技术生成

1. 单一职责

1.1 概述

单一职责原则强调一个类或模块应仅有一个引起其变化的因素(职责)

诠释:
通俗地讲,一个类或模块应只承担一个(或一种类型的)业务职责,而不是将内聚度较弱的业务行为强行耦合。
因为,当类承担的业务职责较多时,该类中任何职责需求的变化都会引起静态实现的变化,导致其代码不稳定。

  • 示例
    如将订单系统和用户系统分开等等

1.2 不良影响

  • 设计类数量的增加
    如果一个庞大的业务系统的所有类都按单一职责设计,则有可能导致设计类数量的“爆炸(Explosion)”。此外,设计类数量的增加也会使设计方案的复杂度增大。
  • 破坏类的封装特性
    由于数据域封装在目标(实体)类中,如果从目标类中将含有数据域访问逻辑的业务行为分离出去,则势必造成外部代码访问目标类私有域的问题,而最终破坏目标类的封装特性。

2. 开放、闭合原则

2.1 概述

开放/闭合原则:要求类或模块的代码“对扩展是开放的(Open for Extension),对修改是关闭的”(Close for Modification)。

诠释:
这意味着,当软件需求发生变化时,目标类或模块的代码可以通过代码扩展很容易地实现新的需求,而不是修改已有类。

  • 示例:
    一个支付类 将某宝支付某信支付分为两个子类,加入信用卡支付或修改某信支付时并不需全盘修改。

2.1 不良影响

  • 代码可读性降低
    抽象代码层隐藏了具体的业务细节,大大降低了代码的可读性。

  • 程序测试成本增加

3. 接口隔离原则

3.1 概述

如果某个接口的行为不是内聚的,就应该按照业务分组,并将分组后的业务行为通过隔离的接口单独定义。

3.2 不良影响

  • 接口数量“爆炸”
  • 代码抽象度高
    抽象度高的代码具有稳定性、可复用性等优点,面向抽象编程较为推崇这种代码设计思维。但也应指出,代码抽象度越高,代码实现越复杂;代码抽象度越高,代码可读性(或可理解度)越差。

4. 依赖倒置原则

4.1 概述

高层模块不应依赖于低层模块,二者都应该依赖于抽象;抽象不应依赖于细节,细节应依赖于抽象。

image.png

4.2 不良影响

增加了代码的复杂度。

5. liskov替换原则

5.1 概述

建议子类对象必须能够完全替换掉它们的父类对象,而不需要改变父类的任何属性。

5.2 违反liskov原则

5.2.1 违反的示例

  • 如下图,画一个表格,有柱状图和线图两种,柱状图需要画图和填充,而折线图只需要绘图
    image.png

说明:
客户端ChartDrawer类在绘制不同类型图表组件时,需要知道父类ChartComponent的子类,然后才能对该组件进行绘制操作,这违反了Liskov替换原则。
因为Liskov替换原则建议:对于客户端程序ChartDrawer来说drawChart()绘制行为使用的父类ChartComponent定义的对象,是可以被其子类Bar或Line定义的对象完全替换,而不需要提供额外的子类信息。

  • 解决
    使得绘图包含填充,则子类可替换父类而不需要输入额外的子类信息。

5.2.2 违反后的代码缺陷

  • 可扩展性差
  • 容易引入逻辑错误

5.3 不良影响

  • 在继承关系中,父类与子类之间是强约束关联
    即子类只能实现(或继承)父类的定义(域或行为),而不能更改;父类定义(域或行为)的变化会迫使所有子类随之变化。
  • 限制了子类重写父类行为的逻辑,降低了代码的灵活性

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值