依赖倒置原则(Dependency Inversion Principle, DIP)是面向对象设计中的五大SOLID原则之一。它强调高层模块不应依赖于低层模块,二者都应依赖于抽象。抽象不应依赖于细节,细节应依赖于抽象。在C++中,依赖倒置原则可以通过接口(抽象类)和依赖注入等技术来实现。
依赖倒置原则的核心思想
-
高层模块不应依赖于低层模块:高层模块通常包含复杂的业务逻辑,而低层模块通常提供一些基础功能。如果高层模块直接依赖于低层模块,那么低层模块的改动可能会影响到高层模块,导致代码难以维护和扩展。
-
二者都应依赖于抽象:通过引入抽象(如接口或抽象类),高层模块和低层模块都可以依赖于这个抽象,而不是直接依赖于具体的实现。这样,低层模块的实现可以独立变化,而不会影响到高层模块。
-
抽象不应依赖于细节,细节应依赖于抽象:抽象应该是稳定的,不应该依赖于具体的实现细节。具体的实现细节应该依赖于抽象,这样可以在不改变抽象的情况下替换或修改具体的实现。
在C++中实现依赖倒置
在C++中,依赖倒置原则可以通过以下方式实现:
-
使用抽象类(接口):定义一个抽象类(接口),高层模块和低层模块都依赖于这个抽象类。
-
依赖注入:通过构造函数、方法参数或属性等方式,将低层模块的实例注入到高层模块中,而不是在高层模块中直接创建低层模块的实例。
示例代码
假设我们有一个高层模块 BusinessLogic
,它依赖于一个低层模块 DatabaseAccess
。我们可以通过依赖倒置原则来设计这两个模块。
#include <iostream>
#include <memory>
// 抽象类(接口)
class IDatabase {
public:
virtual ~IDatabase