设计模式 - 浅谈依赖倒置原则

依赖倒置原则

原则说明: 依赖倒置原则(Dependency Inversion Principle,DIP),高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

为什么要遵守该原则

通过依赖抽象(接口或抽象类)可以用来降低类之间的耦合度,提高系统的可扩展性和可维护性。

示例

// 抽象类或接口
public interface Reader {
    String read();
}

// 低层模块
public class FileReader implements Reader {
    @Override
    public String read() {
        return "读取文件内容";
    }
}

public class DatabaseReader implements Reader {
    @Override
    public String read() {
        return "读取数据库内容";
    }
}

// 高层模块
public class ContentViewer {
    private Reader reader;

    // 通过构造函数或者setter方法,将低层模块的实现注入到高层模块
    public ContentViewer(Reader reader) {
        this.reader = reader;
    }

    public void displayContent() {
        System.out.println(reader.read());
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        Reader fileReader = new FileReader();
        ContentViewer contentViewer = new ContentViewer(fileReader);
        contentViewer.displayContent(); // 输出 "读取文件内容"

        Reader dbReader = new DatabaseReader();
        contentViewer = new ContentViewer(dbReader);
        contentViewer.displayContent(); // 输出 "读取数据库内容"
    }
}

ContentViewer(高层模块)并不直接依赖于FileReaderDatabaseReader(低层模块),而是依赖于Reader接口(抽象)。这样,无论低层模块如何变化,只要接口不变,高层模块就不需要做任何修改。

常见的使用场景

  • 数据库的连接器。
  • 通用的支付场景。

本文链接:

https://pugqq.com/archives/dependency-inversion.html
设计模式 - 浅谈依赖倒置原则 - I/O
快来做第一个评论的人吧~

# 最近更新

JDK国内镜像加速下载2023-05-02

博客评论系统增加悄悄话/匿名留言模式2023-04-10

博客评论系统引入极验api2023-03-22

博客评论系统表情栏优化2023-02-04

centos用firewalld开放端口2022-08-12

数据结构与算法之红黑树2022-03-12

数据结构与算法之字典树2022-03-02

数据结构与算法之LSM树2022-02-24

数据结构与算法之B+树2022-02-15

数据结构与算法之堆2022-02-12