【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )

简介: 【设计模式】软件设计七大原则 ( 里氏替换原则 | 定义 | 定义扩展 | 引申 | 意义 | 优点 )

文章目录

一、里氏替换原则定义

二、里氏替换原则定义扩展

三、里氏替换原则引申意义

四、里氏替换原则意义

五、里氏替换原则优点





一、里氏替换原则定义


里氏替换原则定义 :


如果 对每一个 类型为 T1 的 对象 o1 , 都有 类型为 T2 的 对象 o2 ,


使得 以 T1 定义的 所有程序 P 在 所有对象 o1 都 替换成 o2 时 ,


程序 P 的 行为 没有发生变化 ,


那么 类型 T2 是 类型 T1 的 子类型 ;



符号缩写说明 : T 是 类型 Type , o 是 对象 Object , P 是 程序 Program ;



通俗理解 :


T1 类 生成 o1 对象 ,


T2 类 生成 o2 对象 ,


开发的 程序 P 中 使用了 T1 类型 , 使用 T1 创建了对象 o1 ,


将程序中 所有的 o1 都替换成 T2 o2 时 ,


程序 P 的行为 , 没有发生变化 ,


可以认为 T2 是 T1 的子类型 ;



T2 是 T1 的子类型 , T1 则是 T2 的父类 ;


里氏替换原则 是 继承复用 的基石 , 只有当 子类 可以 替换 父类 , 并且 软件功能不受影响 时 , 父类才能真正的被复用 , 子类也能在父类的基础上 增加新的行为 ;


里氏替换原则 是对 开闭原则 的补充 , 实现开闭原则的关键是 进行抽象 , 父类 和 子类 的继承关系 , 就是 抽象 的具体实现 ;






二、里氏替换原则定义扩展


里氏替换原则定义扩展 :


一个 软件实体 如果 适用于 一个父类的话 ,


那 一定适用于其子类 ,


所有 引用父类的地方 , 必须能 透明地 使用其子类的对象 ,


子类对象 能够 替换父类对象 , 而 程序逻辑不变 ;



通过继承深入理解里氏替换原则 :


抽象类父类中如果已经有实现好的方法 , 实际上 , 是在设定一系列的规范 和 契约 ,


父类不强制要求子类遵从这些契约 ,


但是如果子类任意修改父类的非抽象方法 ,


就会破坏整个继承体系 ,


里氏替换原则 明确反对 子类重写父类方法 ;



继承作为 面向对象 的特性之一 , 给设计程序时 , 带来了很大的便利 , 同时也 带来很多弊端 ;


如 : 使用继承 , 会给程序带来一些侵入性 , 降低可移植性 , 增加了对象间的耦合 ;


如果一个父类 被 很多子类继承 , 假设修改该父类 , 必须考虑所有的子类 , 否则会给系统引入未知风险 ;






三、里氏替换原则引申意义


子类 可以 扩展 父类的功能 , 但是绝对不能 改变 父类原有的功能 ;



子类 可以 实现 父类的 抽象方法 , 但是 不能 覆盖 父类的 非抽象方法 ;



子类中 可以 增加 自己特有的方法 ;



重载 ( 输入参数 宽松 ) : 子类的方法 重载 父类的方法 时 , 方法的前置条件 ( 输入参数 ) , 要比 父类方法的输入参数更宽松 ;


如 : 父类的参数是 HashMap , 如果要符合 里氏替换原则 , 子类如果重载父类方法 , 那么需要使用 Map 类型参数 ;

( 这里注意区分 重写 与 重载 , 重写是重写父类方法 , 重载是函数名相同 , 参数不同 )



重写 ( 返回值 严格 ) : 当 子类的方法 重写 / 重载 / 实现 父类的方法时 , 方法的 后置条件 ( 返回值 ) 要 比父类更严格或相等 ;


如 : 父类的返回值是 Map , 子类的相同的方法 是 Map 或 HashMap ;






四、里氏替换原则意义


里氏替换原则 要求很多 , 但是在程序中 , 如果不遵守 里氏替换原则 ,

尤其是关于 重载 ( 输入参数 宽松 ) 和 重写 ( 返回值 严格 ) , 都没有特别注意 ,

程序也可以正常运行 , 不会出现问题 ;

后果是在 需求变更 , 引入新功能 , 重构时 , 出问题的风险增加 ;

里氏替换原则只是一个约束 , 不是严格执行的标准 ;






五、里氏替换原则优点


里氏替换原则优点 :


防止继承泛滥 : 是 开闭原则 的一种体现 ;

增强健壮性 : 如果满足 里氏替换原则 , 会 加强程序的健壮性 , 同时 变更时 , 可以做到非常好的 兼容性 , 提高程序的 维护性 , 扩展性 ; 降低需求变更时 引入的风险 ;


目录
相关文章
|
2月前
|
设计模式 Java
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
【设计模式】工厂模式(定义 | 特点 | Demo入门讲解)
70 2
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
69 4
|
2月前
|
设计模式 XML Java
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
【设计模式】装饰器模式(定义 | 特点 | Demo入门讲解)
41 0
|
2月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
49 0
|
3月前
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
52 2
|
2月前
|
设计模式 算法 Java
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
【设计模式】策略模式(定义 | 特点 | Demo入门讲解)
37 0
|
3月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。
|
4月前
|
设计模式 微服务
设计模式问题之在软件设计中,“模块”如何定义和区分
设计模式问题之在软件设计中,“模块”如何定义和区分
下一篇
DataWorks