C++设计模式PIMPL模式

Pimpl是"Pointer to implementation"的缩写,它是一种常用的C++设计模式。这种模式的核心思想是将类的实现细节从其接口中分离出来。想象一下,我们生活的世界中充满了这种分离:我们不需要知道电视是如何工作的,只需要知道如何使用遥控器。同样地,Pimpl模式允许我们仅展示类的功能,而隐藏其内部工作方式

在C++中,头文件依赖是一个普遍的问题。当一个头文件改变时,所有包含这个头文件的源文件都需要重新编译。这可能导致编译时间显著增加,特别是在大型项目中。

考虑一个类,它包含了许多私有数据成员和复杂的实现。如果我们把所有这些都放在头文件中,那么任何小小的修改都会触发大量的重新编译。

Pimpl模式通过将实现细节移到源文件中,避免了这个问题,从而使得头文件变得轻量级和稳定。

cpp 复制代码
//DeviceManager类
class DeviceManager {
public:
    DeviceManager() : d_pointer(std::make_unique<DeviceManagerPrivate>(*this)) {}

    void handleDeviceEvent(const std::string& event) {
        // 处理设备事件
        std::cout<<"event:"<<event<<"\n";
    }

    void log(const std::string& message) {
        // 记录日志
        std::cout<<"write to file"<<"\n";
    }

private:
    std::unique_ptr<DeviceManagerPrivate> d_pointer;
};

//DEviceManagerPrivate类
class DeviceManagerPrivate {
public:
    DeviceManagerPrivate(DeviceManager& p_instance)
        : _p_instance(p_instance) {}

    void insertDevice(std::shared_ptr<Device> device) {
        std::lock_guard<std::mutex> lock(_device_map_mutex);
        _device_map[device->getId()] = device;
        _p_instance.handleDeviceEvent("Device inserted"); // 调用DeviceManager的方法
    }

    void removeDevice(uint32_t id) {
        std::lock_guard<std::mutex> lock(_device_map_mutex);
        _device_map.erase(id);
        _p_instance.handleDeviceEvent("Device removed"); // 调用DeviceManager的方法
    }

private:
    DeviceManager& _p_instance;
    std::mutex _device_map_mutex;
    std::map<uint32_t, std::shared_ptr<Device>> _device_map;
};
相关推荐
老歌老听老掉牙12 小时前
案例 7:二维 Rosenbrock 函数最小值(香蕉函数)
c++·pso
Severus_black13 小时前
【C++初阶】Stack、Queue算法题大练兵!
c语言·c++·算法·stl
杯子不吃紫菜15 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
xiaoye-duck17 小时前
《C++ 项目:手写大模型接入 SDK》DataManager数据管理模块:SQLite持久化存储
开发语言·数据库·c++·sqlite
是main不是漫18 小时前
【C++——类和对象(上)】筑基篇:以封装奠定面向对象之基
c语言·开发语言·c++
是2的10次方啊18 小时前
设计模式与生活⑳:楼里的事都找前台,你就再没见过师傅
设计模式
小七在进步1 天前
string的使用(1)
c++·visual studio
白杨尚青1 天前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
kloc1 天前
聊天室项目入口网关子服务的实现
linux·c++
csdn_aspnet1 天前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法