设计模式: Pimpl(Pointer to Implementation)

这种设计模式通常被称为 Pimpl(Pointer to Implementation)惯用法 ,有时也被称为 Cheshire Cat 惯用法。它主要用于隐藏实现细节和减少编译依赖。

例子:

DatabaseConnection.h
cpp 复制代码
#ifndef DATABASE_CONNECTION_H
#define DATABASE_CONNECTION_H

#include <string>

class DatabaseConnection {
public:
    DatabaseConnection(const std::string& connectionString);
    ~DatabaseConnection();

    void connect();
    void disconnect();
    bool isConnected() const;

private:
    class Impl; // 前向声明
    Impl* pImpl; // 指向实现类的指针
};

#endif // DATABASE_CONNECTION_H

DatabaseConnection.cpp

cpp 复制代码
#include "DatabaseConnection.h"
#include <iostream>

// 实现类
class DatabaseConnection::Impl {
public:
    Impl(const std::string& connStr) : connectionString(connStr), connected(false) {}

    void connect() {
        // 模拟连接数据库
        std::cout << "Connecting to database with connection string: " << connectionString << std::endl;
        connected = true;
    }

    void disconnect() {
        // 模拟断开数据库连接
        std::cout << "Disconnecting from database." << std::endl;
        connected = false;
    }

    bool isConnected() const {
        return connected;
    }

private:
    std::string connectionString;
    bool connected;
};

// DatabaseConnection类的实现
DatabaseConnection::DatabaseConnection(const std::string& connectionString)
    : pImpl(new Impl(connectionString)) {}

DatabaseConnection::~DatabaseConnection() {
    delete pImpl;
}

void DatabaseConnection::connect() {
    pImpl->connect();
}

void DatabaseConnection::disconnect() {
    pImpl->disconnect();
}

bool DatabaseConnection::isConnected() const {
    return pImpl->isConnected();
}

这个例子的要点:

  • 信息隐藏DatabaseConnection 的用户不需要知道连接是如何实现的,只需要知道如何使用接口。
  • 减少编译依赖Impl 类的定义在源文件中,头文件中只需要前向声明。
  • 灵活性 :如果需要更改连接的实现(例如,切换到不同的数据库库),只需修改 Impl 类,而不影响 DatabaseConnection 的接口。

这种模式特别适合需要频繁更改实现细节的类,因为它可以在不影响接口的情况下进行更改。

相关推荐
lzb_kkk14 天前
【实习总结】Qt通过Qt Linguist(语言家)实现多语言支持
开发语言·c++·qt·1024程序员节·qt linguist·qt 语言家
Yangy_Jiaojiao22 天前
三维手眼标定
1024程序员节
guozhetao24 天前
【图论,拓扑排序】P1347 排序
数据结构·c++·python·算法·leetcode·图论·1024程序员节
lzb_kkk1 个月前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
lzb_kkk2 个月前
【MFC】编辑框、下拉框、列表控件
c语言·开发语言·c++·mfc·1024程序员节
lzb_kkk2 个月前
【MFC】树控件的使用详解
开发语言·c++·windows·mfc·1024程序员节
SizeTheMoment3 个月前
List介绍
1024程序员节
开利网络3 个月前
产业互联网+三融战略:重构企业增长密码
大数据·运维·服务器·人工智能·重构·1024程序员节
wei_shuo3 个月前
从数据中台到数据飞轮:实现数据驱动的升级之路
1024程序员节·数据飞轮
玖剹4 个月前
矩阵区域和 --- 前缀和
数据结构·c++·算法·leetcode·矩阵·动态规划·1024程序员节