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

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

相关推荐
jamison_13 天前
文心一言与 DeepSeek 的竞争分析:技术先发优势为何未能转化为市场主导地位?
人工智能·ai·chatgpt·gpt-3·1024程序员节
NaZiMeKiY4 天前
HTML5前端第六章节
前端·html·html5·1024程序员节
jamison_18 天前
颠覆未来:解锁ChatGPT衍生应用的无限可能(具体应用、功能、付费模式与使用情况)
ai·chatgpt·1024程序员节
NaZiMeKiY13 天前
HTML5前端第七章节
1024程序员节
earthzhang202117 天前
《Python深度学习》第四讲:计算机视觉中的深度学习
人工智能·python·深度学习·算法·计算机视觉·numpy·1024程序员节
明明真系叻1 个月前
2025.3.2机器学习笔记:PINN文献阅读
人工智能·笔记·深度学习·机器学习·1024程序员节·pinn
bitenum1 个月前
【C++/数据结构】队列
c语言·开发语言·数据结构·c++·青少年编程·visualstudio·1024程序员节
IT学长编程1 个月前
计算机毕业设计 基于SpringBoot的智慧社区管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·后端·毕业设计·课程设计·论文笔记·1024程序员节
qq_382391331 个月前
WPF框架学习
学习·wpf·1024程序员节
✿ ༺ ོIT技术༻2 个月前
Linux:TCP和守护进程
linux·运维·服务器·网络·tcp/ip·1024程序员节