【设计模式】软件设计七大原则 ( 里氏替换原则 | 代码示例 | 类示例 | 方法入参示例 | 方法返回值示例 )(三)

简介: 【设计模式】软件设计七大原则 ( 里氏替换原则 | 代码示例 | 类示例 | 方法入参示例 | 方法返回值示例 )(三)

四、里氏替换原则代码示例 ( 方法入参 | 反面示例 )


在该反面示例中 , 父类中的方法参数是 Map 类型 , 子类中重载的方法参数是 HashMap 类型 ;


如果客户端调用该方法 , 传入一个 HashMap 类型的参数 , 就会出现只能调用重载方法 , 无法调用父类中定义的方法或子类中重写的方法 ;



重载的方法比父类方法参数严格 , 就会出现上述情况 ;



1、父类


package liskovsubstitution;
import java.util.Map;
public class Father {
    public void method(Map map) {
        System.out.println("执行父类 void method(HashMap map) 方法");
    }
}



2、子类


package liskovsubstitution;
import java.util.HashMap;
import java.util.Map;
public class Child extends Father {
    /**
     * 子类重写父类的方法
     * 重写 ( 返回值 严格 ) : 当 子类的方法 重写 / 重载 / 实现 父类的方法时
     *      方法的 后置条件 ( 返回值 ) 要 比父类更严格或相等 ;
     * @param map
     */
    @Override
    public void method(Map map) {
        System.out.println("执行子类重写的 void method(HashMap map) 方法");
    }
    /**
     * 重载的方法
     * 重载 ( 输入参数 宽松 ) : 子类的方法 重载 父类的方法 时
     *      方法的前置条件 ( 输入参数 ) , 要比 父类方法的输入参数更宽松 ;
     *
     * 如果在父类中参数类型是 Map
     *      在子类中重载参数类型是 HashMap
     *      这样就会出现混乱的问题
     * 客户端调用时 , 可能不清楚情况 , 加入传入了 HashMap 参数
     *      此时就有可能出现混乱 , 无法调用到 父类/子类的 正常重写方法
     *      方法调用被重载方法拦截的情况
     *
     * 如果 重载的方法 的参数 比父类的方法参数更严格
     *      那么这就不是重载方法 , 而是重写方法
     *
     * 遵守里氏替换原则很有必要
     * @param map
     */
    public void method(HashMap map) {
        System.out.println("执行子类重载的 void method(Map map) 方法");
    }
}



3、测试类


package liskovsubstitution;
import java.util.HashMap;
public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        HashMap hashMap = new HashMap();
        // 此时传入的 HashMap 参数
        //      由于重载的方法接收的参数是 Map 类型的
        //      此时调用的是父类的方法 或 子类重写的 void method(HashMap map) 方法
        //      不会调用重载的 void method(Map map) 方法
        child.method(hashMap);
    }
}


执行结果 :


执行子类重载的 void method(Map map) 方法








五、里氏替换原则代码示例 ( 方法返回值 )


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


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



该错误基本不可能触犯 , 因为编译时会检查 , 如果发现子类的实现方法的返回值 大于 父类方法 , 编译时会报错 , 下图就是编译报错情况 :





1、父类


package liskovsubstitution;
import java.util.Map;
public abstract class Father {
    public abstract Map method();
}


2、子类


package liskovsubstitution;
import java.util.HashMap;
public class Child extends Father {
    /**
     * 子类重写父类的方法
     *      重写方法的返回值 , 严格程度 , 一定要小于等于父类方法的返回值
     * @return
     */
    @Override
    public HashMap method() {
        System.out.println("子类实现的父类的 HashMap method() 被执行");
        HashMap hashMap = new HashMap();
        return hashMap;
    }
}



3、测试类


package liskovsubstitution;
public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.method();
    }
}


执行结果 :


子类实现的父类的 HashMap method() 被执行


目录
相关文章
|
8月前
|
设计模式 架构师 Java
设计模式觉醒系列(01)设计模式的基石 | 六大原则的核心是什么?
本文介绍了设计模式的六大原则,包括单一职责原则(SRP)、开闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)和迪米特法则。通过具体案例分析了每个原则的应用场景及优势,强调了这些原则在提升代码可维护性、可复用性、可扩展性和降低耦合度方面的重要作用。文章指出,设计模式的核心在于确保系统模块间的低耦合高内聚,并为后续深入探讨23个经典设计模式打下基础。
|
10月前
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
1953 1
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
12月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
5月前
|
设计模式 Java 数据库连接
【设计模式】【创建型模式】工厂方法模式(Factory Methods)
一、入门 什么是工厂方法模式? 工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它定义了一个用于创建对象的接口,但由子类决定实例化哪个类。工厂方法模式使类的实例化延迟
141 16
|
5月前
|
设计模式 负载均衡 监控
并发设计模式实战系列(2):领导者/追随者模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第二章领导者/追随者(Leader/Followers)模式,废话不多说直接开始~
137 0
|
5月前
|
设计模式 监控 Java
并发设计模式实战系列(1):半同步/半异步模式
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发设计模式实战系列,第一章半同步/半异步(Half-Sync/Half-Async)模式,废话不多说直接开始~
129 0
|
5月前
|
设计模式 安全 Java
并发设计模式实战系列(12):不变模式(Immutable Object)
🌟 大家好,我是摘星!🌟今天为大家带来的是并发设计模式实战系列,第十二章,废话不多说直接开始~
103 0
|
5月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。

热门文章

最新文章