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

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

3、正方形类


package liskovsubstitution;
/**
 * 正方形
 */
public class Square implements Quadrangle {
    /**
     * 正方形边长
     */
    private long sideLength;
    @Override
    public long getLength() {
        return this.sideLength;
    }
    @Override
    public long getWidth() {
        return this.sideLength;
    }
    public long getSideLength() {
        return sideLength;
    }
    public void setSideLength(long sideLength) {
        this.sideLength = sideLength;
    }
}


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


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


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

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



如果在父类中参数类型是 Map , 在子类中重载参数类型是 HashMap , 这样就会出现混乱的问题 ;


客户端调用时 , 可能不清楚情况 , 加入传入了 HashMap 参数 , 此时就有可能出现混乱 , 无法调用到 父类/子类的 正常重写方法 , 方法调用被重载方法拦截的情况 ;


如果 重载的方法 的参数 比父类的方法参数更严格 , 那么这就不是重载方法 , 而是重写方法 ;



1、父类


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

1


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


在该反面示例中 , 父类中的方法参数是 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) 方法");
    }
}



目录
相关文章
|
4月前
|
设计模式
设计模式七大原则
这篇文章介绍了设计模式中的七大原则,特别强调了单一职责原则,即一个类应该只有一个引起其行为变化的原因,以确保类功能的高内聚和低耦合。
|
4月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
6月前
|
设计模式 供应链
设计模式六大原则之迪米特法则
设计模式六大原则之迪米特法则
|
3月前
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
4月前
|
设计模式 算法 开发者
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
|
4月前
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
|
4月前
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是设计模式,单一职责原则如何理解
React开发设计模式及原则概念问题之什么是设计模式,单一职责原则如何理解
|
6月前
|
设计模式 uml
设计模式学习心得之前置知识 UML图看法与六大原则(下)
设计模式学习心得之前置知识 UML图看法与六大原则(下)
46 2
|
6月前
|
设计模式 Java 数据库
深入理解设计模式六大原则
深入理解设计模式六大原则
|
6月前
|
设计模式 数据可视化 程序员
设计模式学习心得之前置知识 UML图看法与六大原则(上)
设计模式学习心得之前置知识 UML图看法与六大原则(上)
48 0
下一篇
DataWorks