依赖倒置原则表示高层模块不应该依赖低层模块,两者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。也就是说,要针对接口编程,而不是针对实现编程。
依赖倒置原则是面向对象设计的重要原则之一,它体现了面向对象的思想和封装的特性。如果一个软件能够遵循依赖倒置原则,那么它就具有以下两个优点:
举个例子,假设我们有一个电脑类 Computer,它有一个方法 work(),表示电脑可以工作。然后我们定义了一个键盘类 Keyboard 和一个鼠标类 Mouse 来作为电脑的组件。Computer 类依赖于 Keyboard 类和 Mouse 类,代码如下:
class Keyboard {
public void input() {
System.out.println("键盘输入");
}
}
class Mouse {
public void click() {
System.out.println("鼠标点击");
}
}
class Computer {
private Keyboard keyboard;
private Mouse mouse;
public Computer(Keyboard keyboard, Mouse mouse) {
this.keyboard = keyboard;
this.mouse = mouse;
}
public void work() {
keyboard.input();
mouse.click();
System.out.println("电脑工作");
}
}
这个类违反了依赖倒置原则,因为它直接依赖于具体的实现类,而不是抽象的接口。这样的设计有以下几个缺点:
为了遵循依赖倒置原则,我们应该将 Keyboard 类和 Mouse 类设计成实现一个共同的接口 Component。然后,Computer 类只依赖于 Component 接口,而不依赖于具体的实现类。这样,在程序中可以将任何实现了 Component 接口的对象作为电脑的组件,而不改变 Computer 类的逻辑。代码如下:
interface Component {
public void work();
}
class Keyboard implements Component {
@Override
public void work() {
System.out.println("键盘输入");
}
}
class Mouse implements Component {
@Override
public void work() {
System.out.println("鼠标点击");
}
}
// 其他组件类型的实现类省略
class Computer {
private List<Component> components;
public Computer(List<Component> components) {
this.components = components;
}
public void work() {
for (Component component : components) {
component.work();
}
System.out.println("电脑工作");
}
}