这个原则是经典 OOP 设计思想之一,原文是:
“Program to an interface, not an implementation.”
直译:“针对接口编程,而不是针对实现编程。”
1. 什么意思?
-
对实现编程:代码里直接依赖某个具体类。
-
对接口编程:代码里依赖的是抽象(接口 / 抽象类),而不是具体实现。
这样可以把 使用者 和 实现者 解耦。
2. 举例说明
❌ 错误示范(对实现编程)
class MySQLDatabase {
public:
void connect() { /* MySQL 的实现 */ }
};
class UserService {
private:
MySQLDatabase db; // 直接依赖具体类
public:
void init() { db.connect(); }
};
问题:如果以后想换 PostgreSQL、SQLite,就要改 UserService 里的代码。
✅ 正确示范(对接口编程)
class IDatabase {
public:
virtual void connect() = 0; // 抽象接口
virtual ~IDatabase() {}
};
class MySQLDatabase : public IDatabase {
public:
void connect() override { /* MySQL 的实现 */ }
};
class PostgreSQLDatabase : public IDatabase {
public:
void connect() override { /* PostgreSQL 的实现 */ }
};
class UserService {
private:
IDatabase* db; // 面向接口
public:
UserService(IDatabase* database) : db(database) {}
void init() { db->connect(); }
};
好处:
-
UserService不关心数据库是 MySQL 还是 PostgreSQL,只认IDatabase。 -
想换实现,只需要传入不同的对象。
-
方便测试(可以传入一个
MockDatabase)。
3. 为什么要对接口编程?
-
降低耦合:调用方和实现解耦。
-
提高扩展性:只要实现接口,就能无缝替换。
-
方便测试:依赖注入 mock 实现,不用真的连数据库。
-
符合依赖倒置原则 (DIP):高层模块不应该依赖底层实现,而是依赖抽象。

被折叠的 条评论
为什么被折叠?



