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

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

相关推荐
比奥利奥还傲.2 天前
哪吒监控面板实战:部署 Dashboard、接入 Agent、钉钉告警,再配置固定公网访问
网络·人工智能·分布式·1024程序员节
默 语3 天前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
学传打活19 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活24 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng1681 个月前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心1 个月前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055271 个月前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055271 个月前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝1 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055271 个月前
Java图像处理实战指南
人工智能·1024程序员节