理解《对接口编程而不是对实现编程》

这个原则是经典 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):高层模块不应该依赖底层实现,而是依赖抽象。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值