【六大设计原则】里氏替换原则

809 阅读2分钟

六大设计原则

单一职责原则

里氏替换原则

依赖倒置原则

接口隔离原则

迪米特法则

开放封闭原则

定义

如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。

白话点来说就是,子类可以扩展父类的功能,但不能改变父类原有的功能。

继承

优点

1) 代码共享,减少创建类的工作量,每个子类都拥有父类的属性和方法;

2) 提高代码的重用性;

3) 子类可以形似父类,但又异于父类;

4) 提高代码的可扩展性;

5) 提高产品或项目的开放性。

缺点

1) 继承是侵入性的。只要继承,就必须拥有父类的属性和方法。

2) 降低代码的灵活性。子类会多一些父类的约束。增强了耦合性。

3) 当父类的常量、变量、方法被修改时,需要考虑子类的修改。

继承弊端举例

此处用木鱼不是鱼,不会游泳示例

设计一个鱼类

public class Fish {

    public void swim() {
        System.out.println("鱼都会游泳");
    }
}

调用

public class Client {

    public static void main(String[] args) {
        Fish fish = new Fish();
        fish.swim();
    }
}

结果

image.png

设计一个木鱼类继承鱼类

木鱼不会游泳,可以敲击

public class WoodenFish extends Fish {

    public void swim() {
        System.out.println("木鱼不会游泳");
    }

    public void knock() {
        System.out.println("木鱼可以敲击");
    }
}

调用

public class Client {

    public static void main(String[] args) {
        WoodenFish fish = new WoodenFish();
        fish.swim();
        fish.knock();
    }
}

结果

image.png

我们发现原本运行正常的鱼能游泳功能发生了错误。原因就是木鱼类在给方法起名时重名,导致重写了父类的方法,造成所有鱼能游泳的功能的代码全部调用了木鱼类重写后的方法,造成原本正常的功能出现了错误。

四层含义

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

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

  • 当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。

  • 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。