C++实现“隐藏实现,开放接口”的方案

在C++中,可以通过以下几种方式实现”隐藏实现,开放接口”:

1. 使用接口类

定义一个接口类,在里面声明纯虚函数,然后让实现类继承该接口类并实现纯虚函数客户端代码只需要持有接口类的指针或引用,然后通过多态调用实现类的函数。

// 接口类
class IDevice { 
public:
    virtual void open() = 0;
    virtual void close() = 0;
};
// 实现类
class Disk : public IDevice {
public:
    void open() { /* 实现打开磁盘 */ } 
    void close() { /* 实现关闭磁盘 */ }
};
// 客户端代码
IDevice *p = new Disk(); 
p->open();   // 调用Disk::open()
p->close();  // 调用Disk::close()

2. 利用PImpl构的实现

PImpl代表Pointer to Impementation,也就是将实现类包装在接口类内部,客户端持有接口类实例的指针,接口类再持有实现类实例的指针,实现解耦。

// 接口类
class Impl;
class IDevice {
public:
    IDevice();
    ~IDevice();
    void open();
    void close(); 
private:
    Impl *pimpl;   // 持有具体实现的指针
};

// 实现类
class Disk : public Impl {
public:
   void open() { /* 实现打开磁盘 */ } 
   void close() { /* 实现关闭磁盘 */ }  
};

// 接口类实现  
IDevice::IDevice() { pimpl = new Disk(); }
IDevice::~IDevice() { delete pimpl; }
void IDevice::open() { pimpl->open(); }  
void IDevice::close() { pimpl->close(); }

3. 使用抽象基类

定义一个抽象基类,在里面声明纯虚函数,让实现类继承并实现这些函数。然后客户端通过该基类的指针或引用调用实现类的函数。

// 抽象基类 
class IDevice { 
public:
    virtual void open() = 0;
    virtual void close() = 0;
};

// 具体实现类
class Disk : public IDevice {
public:
    void open() { /* 实现打开磁盘 */ } 
    void close() { /* 实现关闭磁盘 */ }
}; 

// 客户端代码
IDevice *p = new Disk();  
p->open();   // 调用Disk::open() 
p->close();  // 调用Disk::close()

以上几种方式都是较典型的实现”隐藏实现,开放接口”的方案,可以根据具体需要选择适合的方式。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论