SOLID 设计原则:Liskov 替换原则和依赖倒置原则

Tah*_*san 3 liskov-substitution-principle solid-principles dependency-inversion

只是对 Stack Overflow 和 Microsoft 开发社区的一个想法和一个关于称为 SOLID 的 OO 软件设计原则的问题。请问Liskov替换原则和依赖倒置原则有什么区别?我已经考虑了一段时间,但我不确定其中的区别。请问你能告诉我吗?非常欢迎任何想法/反馈。

chr*_*ins 7

Liskov 的替换原则声明如下:

一个类应该可以直接用它的基类替换

这意味着如果子类扩展了父类,它应该是可直接替换的。 图像可在此处查看

如果你看以为例。不是所有的鸟都会飞——但有些鸟会飞。

让我们看一个java示例:

Bird  ostrich = new Ostrich();
Run Code Online (Sandbox Code Playgroud)

如果我要把我的鸵鸟当作一只鸟(是基类/父类),我们在中有让鸵鸟飞的功能,即使它们不应该飞!

所以我们可以分离出结构: Refactoredhierarchy for Liskov's

当将依赖倒置视为一个单独的原则时,它会更容易。

如果我们有一个类调用一个类。这使得以后很难更改它,并且需要我们更改源代码。再次让我们看一个代码示例。

public class App {
    public static void main(String[] args) {
        Greeting greeting = new Greeting();
        greeting.sayHello(new Friend()); 
        greeting.sayHello(new Enemy());
    }
}

public class Greeting {
    public void sayHello(Person person) {
         person.greet();
    }
}

public interface Person {
    public void greet();
}

public class Friend implements Person {
    public void greet() {
        System.out.println("Hello my friend");
    }
}

public class Enemy implements Person {
    public void greet() {
        System.out.println("Go away");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里我们传递两个项目(朋友和敌人)的父对象(人)。如果我们通过一个 Friend 对象,我们需要一个单独的 Enemy 方法相同的方法。我们可以使用 Open/Closed 原则来拥有一个可以调用 Friend 或 Enemy 或将来可能扩展 Person 的任何方法的单一方法。依赖倒置是通过 Parent 对象而不是创建类的 sayHello() 方法。这意味着我们调用哪个 Parent 对象取决于 App,而不是 sayHello() 决定调用哪个对象。

更好的做法是使用依赖倒置。类greet() 调用不是一成不变的,只要传递的类是实现Person 的类。

这意味着不是 App 依赖于 Friend。Friend 还是 Enemy 被调用取决于 App。

像这样传递责任意味着我们的代码可以很容易地维护和更改。使用上下文和依赖注入,配置文件可以确定在引用指定接口时我们想要使用哪种类型的对象。