设计模式: 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 的接口。

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

相关推荐
一个通信老学姐5 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui5 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9266 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20216 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒7 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang20217 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐7 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
earthzhang20218 天前
《深入浅出HTTPS》读书笔记(18):公开密钥算法RSA(续)
网络·网络协议·算法·https·1024程序员节
明明真系叻9 天前
第二十五周机器学习笔记:卷积神经网络复习、动手深度学习—线性回归、感知机
笔记·机器学习·线性回归·1024程序员节
java李杨勇10 天前
基于大数据爬虫数据挖掘技术+Python的网络用户购物行为分析与可视化平台(源码+论文+PPT+部署文档教程等)
大数据·爬虫·数据挖掘·1024程序员节·网络用户购物行为分析可视化平台·大数据毕业设计