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

依赖倒置原则

原则说明: 依赖倒置原则(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
2 评论
    dltuawqaurSogo BrowserWindows 10
    11月28日 回复

    你的文章让我感受到了艺术的魅力,谢谢! https://www.4006400989.com/qyvideo/53039.html

    wvkjmlnzxxSogo BrowserWindows 10
    11月25日 回复

    你的文章让我感受到了快乐,每天都要来看一看。 https://www.yonboz.com/video/51975.html

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21