(DIP) 依赖倒置原则 Dependency Inversion Principle核心原则抽象不应该依赖细节细节应该依赖于抽象。场景描述在一个应用程序 Application 中需要使用到数据库比如我们此时需要使用到 Mysql 数据库。Mysql 数据库分别具有连接断开关闭执行 sql 语句等操作。因此基于单一职责原则可以单独封装起来。#include string class MySql { public: void connect_mysql() { } void execute_mysqlSQL(const std::string sentence) { } void close_mysql() { } }; class Application { private: MySql* m_sqlPtr nullptr; public: Application(MySql* sqlPtr) { m_sqlPtr sqlPtr; m_sqlPtr-connect_mysql(); } ~Application() { m_sqlPtr-close_mysql(); delete m_sqlPtr; } void exec_sql(const std::string sentence) { m_sqlPtr-execute_mysqlSQL(sentence); } }; int main() { Application app(new MySql{}); }问题暴露随着程序的开发和团队的各种决策问题此时有可能需要更换数据库如从 Mysql 数据库换成 Sqlite 数据库。无脑的开发者容易直接重新写一个 Sqlite 类并将 Application 中原先使用 Mysql 的地方全部替换。这显然是很低级的操作。