设计模式六原则 - 依赖倒置原则

依赖倒置原则(DependencyInversionPrinciple, DIP)

抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。

  • 依赖倒置原则的核心思想是面向接口编程

  • 相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建起来的架构比以细节为基础搭建起来的架构要稳定的多。

  • 如果说开闭原则是面向对象的设计目标,依赖倒置就是实现的主要机制之一

  • 将具体类的对象通过依赖注入(DependencyInjection, DI)的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入(Setter注入)和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象来覆盖父类对象。

  • 低层模块尽量都要有抽象类或接口,或者两者都有。

  • 变量的声明类型尽量是抽象类或接口。

  • 使用继承时遵循里氏替换原则。

说的那么复杂给个例子来说明下

问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Book{  
public String getContent(){
return "获取书的内容";
}
}
class Person{
public void read(Book book){
System.out.println(book.getContent());
}
}

public class Main {
public static void main(String[] args){
Person p = new Person();
p.read(new Book());
}
}

如果还要读取报纸或者其他类型,就要不断修改Person类,这样的设计肯定不好。所以就引入一个抽象化的接口IReader来降低Person和Book之间的耦合。

修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public interface IReader {
String getContent();
}

public class Book implements IReader{
public String getContent() {
return "读取书中的内容";
}
}

public class NewsPaper implements IReader{
public String getContent() {
return "读取报纸内容";
}
}

public class Person {
public void read(IReader reader){
System.out.println(reader.getContent());
}
}

public class Main {
public static void main(String[] args){
Person person = new Person();
person.read(new Book());
person.read(new NewsPaper());
}
}

六大设计原则:

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器