设计模式系列(二)设计模式原则——里氏替换原则(Liskov Substitution Principle)

里氏替换原则用于规范类的继承,防止类父类的修改过多影响到子类而提出的一种设计原则。

  • 里氏替换原则在1988年,由麻省理工学院的Liskov女士提出的。

  • 如果对每个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序 P在所有的对象o1都代换成o2时,程序P的行为没有发生变化,那么类型T2是类型T1 的子类型。所有引用基类的地方必须能透明地使用其子类的对象

  • 在使用继承时,遵循里氏替换原则,在子类中尽量不要重写父类的方法

  • 里氏替换原则告诉我们,继承实际上让两个类耦合性增强了,在适当的情况下,可 以通过聚合,组合,依赖来解决问题。

举例:这条原则用于规范的约束,继承需要谨慎使用

public class Liskov {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.func1(8, 3));
        
        B b = new B();
        System.out.println(b.func1(8, 3)); // 求 8 - 3,由于B类重写A类的方法而造成了歧义
        System.out.println(b.func2(8, 3)); // 
    }
}

class A {
    public int func1(int a, int b) {
        return a - b;
    }
}

class B extends A{
    // 重写了父类的func1方法
    public int func1(int a, int b) {
        return a + b;
    }
    
    public int func2(int a, int b) {
        return func1(a, b) + 9;
    }
}

// 里氏替换改写
class Base {
	public int func1(int a, int b) {
        return a - b;
    }   
}

class A extends Base {
    public int func1(int a, int b) {
        return a - b;
    }
}

class B extends Base {
    private A a = new A(); // 组合依赖
    
    // 重写了父类的func1方法
    public int func1(int a, int b) {
        return a + b;
    }
    
    public int func2(int a, int b) {
        return this.a.func1(a, b) + 9;
    }
}

设计模式系列(一)概述https://mp.csdn.net/mp_blog/creation/editor/121142794

设计模式系列(二)设计模式原则——单一职责原则https://mp.csdn.net/mp_blog/creation/editor/121142959


设计模式系列(二)设计模式原则——接口隔离原则icon-default.png?t=LA46https://blog.csdn.net/github_34709302/article/details/121144546设计模式系列(二)设计模式原则——依赖倒转原则 (dependency inversion principle)_Jackie的博客-CSDN博客描述高层模块不应该依赖低层模块,二者都应该依赖其抽象抽象不应该依赖细节,细节应该依赖抽象依赖倒转(倒置)的中心思想是面向接口编程依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在Java中, 抽象指的是接口或抽象类,细节就是具体的实现类使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成示例:使用Person类完成消息接https://blog.csdn.net/github_34709302/article/details/121167975

你可能感兴趣的:(设计,架构,里氏替换原则)