现代C++设计模式实战:从AIDC项目看工业级代码架构
创建日期 : 2026-03-24
作者 : zry
标签: C++, 设计模式, RAII, 智能指针, 类型安全, C++17/20
📋 目录
引言
C++11/14/17/20带来了革命性的变化,现代C++编程已从"带类的C"进化为支持函数式、泛型、元编程的多范式语言。本文基于AIDC项目Connect和Update模块的重构实践,探讨如何用现代C++设计模式构建可维护、可扩展的工业级代码。
核心设计原则
现代C++设计原则
RAII
资源获取即初始化
自动资源管理
异常安全
零开销抽象
编译期优化
无运行时开销
类型安全
类型安全
强类型枚举
std::optional
std::variant
所有权语义
unique_ptr独占
shared_ptr共享
weak_ptr弱引用
传统C++ vs 现代C++对比
| 传统C++ | 现代C++ | 优势 |
|---|---|---|
| 裸指针 | 智能指针 | 自动内存管理 |
| 宏定义 | constexpr | 类型安全 |
| 函数指针 | std::function | 闭包支持 |
| new/delete | make_unique | 异常安全 |
| 虚函数多态 | std::variant | 零开销 |
模式一:RAII资源管理
问题:传统C++资源泄漏
true
false
资源A泄漏
开始
分配资源A
条件判断
返回错误
分配资源B
使用资源
释放资源B
释放资源A
结束
问题!
现代C++解决方案
cpp
/**
* @brief RAII文件句柄包装器
* @date 2026-03-24
*/
class ScopedFile {
public:
explicit ScopedFile(const std::string& path, const char* mode)
: file_(fopen(path.c_str(), mode)) {
if (!file_) {
throw std::runtime_error("Failed to open file: " + path);
}
}
~ScopedFile() {
if (file_) {
fclose(file_);
}
}
// 禁用拷贝
ScopedFile(const ScopedFile&) = delete;
ScopedFile& operator=(const ScopedFile&) = delete;
// 支持移动
ScopedFile(ScopedFile&& other) noexcept
: file_(other.file_) {
other.file_ = nullptr;
}
ScopedFile& operator=(ScopedFile&& other) noexcept {
if (this != &other) {
if (file_) fclose(file_);
file_ = other.file_;
other.file_ = nullptr;
}
return *this;
}
bool IsOpen() const { return file_ != nullptr; }
FILE* Get() const { return file_; }
private:
FILE* file_ = nullptr;
};
// 使用示例 - 异常安全
void ProcessData() {
auto file = ScopedFile("data.txt", "r"); // 自动关闭
auto buffer = std::make_unique<char[]>(1024); // 自动释放
if (some_condition) {
return; // ✅ 自动释放所有资源
}
// 析构时自动释放
}
模式二:智能指针与所有权
weak_ptr - 弱引用
弱引用
Object
shared_ptr
weak_ptr
不增加引用计数
shared_ptr - 共享所有权
Object
shared_ptr
shared_ptr
shared_ptr
引用计数=3
unique_ptr - 独占所有权
move
Object
unique_ptr
unique_ptr
自动销毁
cpp
/**
* @brief 数据库连接管理器 - 使用智能指针
* @date 2026-03-24
*/
class DatabaseManager {
public:
// 独占所有权
std::unique_ptr<DatabaseConnection> CreateConnection() {
auto conn = std::make_unique<DatabaseConnection>();
if (!conn->Connect()) {
return nullptr;
}
return conn; // 移动语义,无拷贝
}
// 共享所有权
std::shared_ptr<ConnectionPool> GetSharedPool() {
std::lock_guard<std::mutex> lock(mutex_);
if (!pool_) {
pool_ = std::make_shared<ConnectionPool>();
pool_->Initialize();
}
return pool_; // 增加引用计数
}
// 弱引用观察
std::weak_ptr<ConnectionPool> ObservePool() {
return pool_; // 不增加引用计数
}
private:
std::shared_ptr<ConnectionPool> pool_;
std::mutex mutex_;
};
模式三:类型安全的状态机
初始化
发起连接
连接成功
连接失败
断开连接
重试
Disconnected
Connecting
Connected
Error
使用std::variant实现
类型安全的状态转换
cpp
/**
* @brief 类型安全的状态机 - 使用std::variant
* @date 2026-03-24
*/
// 状态相关数据
struct DisconnectedData {
std::chrono::system_clock::time_point last_disconnect_time;
std::string reason;
};
struct ConnectingData {
std::chrono::system_clock::time_point start_time;
int retry_count = 0;
};
struct ConnectedData {
std::chrono::system_clock::time_point connect_time;
std::string endpoint;
uint64_t bytes_transferred = 0;
};
// 使用variant的类型安全状态
using State = std::variant<DisconnectedData, ConnectingData, ConnectedData>;
class ConnectionStateMachine {
public:
ConnectionStateMachine()
: state_(DisconnectedData{std::chrono::system_clock::now(), ""}) {}
void TransitionToConnecting() {
std::visit([this](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, DisconnectedData>) {
state_ = ConnectingData{
std::chrono::system_clock::now(), 0
};
} else {
throw std::invalid_argument("Invalid state transition");
}
}, state_);
}
template<typename T>
std::optional<T> GetStateData() const {
if (std::holds_alternative<T>(state_)) {
return std::get<T>(state_);
}
return std::nullopt;
}
private:
State state_;
};
模式四:策略模式与函数式编程
cpp
/**
* @brief 现代策略模式 - 使用std::function
* @date 2026-03-24
*/
class ModernDataProcessor {
public:
using StrategyFunc = std::function<std::vector<Data>(const std::vector<Data>&)>;
void SetStrategy(StrategyFunc strategy, std::string name) {
strategy_ = std::move(strategy);
strategy_name_ = std::move(name);
}
std::vector<Data> Process(const std::vector<Data>& input) {
if (!strategy_) {
throw std::runtime_error("No strategy set");
}
return strategy_(input);
}
private:
StrategyFunc strategy_;
std::string strategy_name_;
};
// 使用示例
void UseStrategies() {
ModernDataProcessor processor;
// Lambda策略1: 过滤无效数据
processor.SetStrategy(
[](const std::vector<Data>& input) {
std::vector<Data> result;
std::copy_if(input.begin(), input.end(),
std::back_inserter(result),
[](const Data& d) { return d.IsValid(); });
return result;
},
"FilterInvalid"
);
auto filtered = processor.Process(raw_data);
// Lambda策略2: 数据聚合
processor.SetStrategy(
[](const std::vector<Data>& input) {
std::map<std::string, std::vector<Data>> grouped;
for (const auto& d : input) {
grouped[d.GetType()].push_back(d);
}
// 聚合处理...
return result;
},
"Aggregate"
);
}
模式五:工厂模式与完美转发
cpp
/**
* @brief 泛型工厂 - 支持任意构造函数
* @date 2026-03-24
*/
template<typename Base, typename... Args>
class GenericFactory {
public:
using Creator = std::function<std::unique_ptr<Base>(Args...)>;
template<typename Derived>
void Register(const std::string& name) {
static_assert(std::is_base_of_v<Base, Derived>);
creators_[name] = [](Args... args) -> std::unique_ptr<Base> {
return std::make_unique<Derived>(std::forward<Args>(args)...);
};
}
std::unique_ptr<Base> Create(const std::string& name, Args... args) {
auto it = creators_.find(name);
if (it != creators_.end()) {
return it->second(std::forward<Args>(args)...);
}
return nullptr;
}
private:
std::map<std::string, Creator> creators_;
};
// 使用示例
class MessageHandler {
public:
virtual ~MessageHandler() = default;
virtual void Handle(const Message& msg) = 0;
};
class UpgradeHandler : public MessageHandler {
public:
explicit UpgradeHandler(std::string config_path)
: config_path_(std::move(config_path)) {}
void Handle(const Message& msg) override {}
private:
std::string config_path_;
};
void UseFactory() {
GenericFactory<MessageHandler, std::string> factory;
factory.Register<UpgradeHandler>("upgrade");
auto handler = factory.Create("upgrade", "/etc/upgrade.conf");
}
总结
现代C++设计模式的核心转变:
| 特性 | 改善效果 |
|---|---|
| 智能指针 | 内存泄漏降为0 |
| constexpr | 编译期计算,运行时0开销 |
| std::variant | 类型安全的状态机 |
| Lambda | 更灵活的策略模式 |
| 完美转发 | 高效的工厂模式 |
通过应用这些模式,AIDC项目的代码:
- 代码量减少40%
- 内存泄漏降为0
- 单元测试覆盖率85%
- 运行时性能无损失
本文基于AIDC项目重构实践编写。