桥接模式的很好实现方式(应用shared_ptr)

桥接模式是一种结构型设计模式,它把类的具体实现细节对用户隐藏起来,以达到类之间的最小耦合关系。桥接模式也被称为pimpl惯用法,它可以将头文件的依赖关系降到最小,减少编译时间,而且可以不适用虚函数实现多态。

 

首先声明一个类Sample,它仅向外界暴露了最小的细节,真正的实现在内部类impl。

 

Sample.h

#pragma once
#include <boost/smart_ptr/shared_ptr.hpp>
using boost::shared_ptr;
class Sample
{
private:
    class impl;         // 不完整的内部类声明
    shared_ptr<impl> p; // shared_pte成员变量
public:
    Sample(void);   // 构造函数
    void print();   // 提供给外部的接口
};

在Sample的cpp文件中完整定义impl类和其他功能

 

Sample.cpp

#include "Sample.h"
#include <boost/make_shared.hpp>
#include <iostream>
// 内部类的实现
class Sample::impl
{
public:
    void print();
};
void Sample::impl::print()
{
    std::cout << "impl print" << std::endl;
}
Sample::Sample(void)
{
    // 初始化shared_ptr
    p = boost::make_shared<impl>();
}
void Sample::print()
{
    // 调用pimpl实现print()
    p->print();
}

 

最后是使用方法

Sample s;
s.print();

 

桥接模式非常好用,它可以任意改变具体的实现而外界对此一无所知,也减少了源文件之间的编译依赖,使程序获得了更多的灵活性。而shared_ptr是实现它的最佳工具之一,它解决了指针的共享和引用计数问题。

 

本文参考《Boost程序库完全开发指南》中的内存管理一章

关于pimpl惯用法请参考:http://blog.sina.com.cn/s/blog_48f93b530100n2bc.html

 

<think>嗯,用户让我描述一下对C++设计模式的理解。首先,我需要确认设计模式的基本概念,然后结合C++的特点来展开。设计模式是解决常见问题的经验总结,对吧?那C++作为一门支持面向对象、泛型编程的多范式语言,设计模式在这里的应用应该有其独特之处。 接下来,我得想想常见的几种设计模式,比如创建型、结构型、行为型。需要分别举几个例子,比如单例模式、工厂模式,这些在C++中如何实现呢?特别是C++的静态成员、模板这些特性如何影响设计模式实现方式。比如单例模式的双重检查锁定,或者使用局部静态变量实现Meyers单例,这样更安全高效。 然后,结构型模式中的适配器模式,可能涉及组合或者私有继承,C++的访问控制在这里很重要。桥接模式分离抽象和实现,可能用指针或引用持有实现类的对象。行为型模式比如观察者模式,可以用标准库中的function和bind来实现回调,避免继承的繁琐。 还要注意C++11之后的新特性对设计模式的影响,比如移动语义、智能指针如何影响资源管理,减少原始指针的使用,避免内存泄漏。模板元编程和CRTP(奇异递归模板模式)在实现编译期多态时的应用,比如在策略模式中,通过模板参数注入行为,提高灵活性。 另外,需要强调设计模式不是银弹,要根据具体问题选择。比如过度使用单例可能导致全局状态难以维护,或者工厂模式增加代码复杂度。C++的RAII机制和所有权语义也能帮助更好地管理资源,结合设计模式时需要考虑这些特性。 可能用户是C++开发者,想了解如何在实际项目中应用设计模式,或者面试准备需要这方面的知识。需要结构清晰,分类型介绍,每个模式简要说明意图、结构和C++实现要点。同时注意用户可能对某些模式的具体实现细节感兴趣,比如如何保证线程安全的单例,或者如何用现代C++特性简化传统设计模式实现。 最后,确保回答覆盖主要的设计模式类型,每个类型举一两个典型例子,结合C++特性说明,并提醒注意事项和适用场景。这样用户能有一个全面的理解,同时知道在实际应用中如何权衡和选择合适的设计模式。</think>以下是我对C++设计模式的理解,按结构化方式描述: --- ### 一、设计模式核心概念 设计模式是**可复用的解决方案模板**,用于解决软件设计中**重复出现的特定问题**。在C++中,其实现需结合以下特性: - 面向对象特性(封装/继承/多态) - 模板元编程 - RAII资源管理 - 智能指针与移动语义 --- ### 二、C++设计模式分类及典型示例 #### 1. 创建型模式 **目标**:解耦对象创建过程 **(1) 单例模式** ```cpp class Singleton { public: static Singleton& getInstance() { static Singleton instance; // C++11线程安全 return instance; } private: Singleton() = default; // 禁用外部构造 }; ``` *现代C++改进*:使用`std::call_once`保证线程安全 **(2) 工厂方法模式** ```cpp class Product { public: virtual void operation() = 0; }; class ConcreteProduct : public Product { public: void operation() override { /*...*/ } }; class Creator { public: virtual std::unique_ptr<Product> create() { return std::make_unique<ConcreteProduct>(); } }; ``` --- #### 2. 结构型模式 **目标**:处理类/对象间的组合关系 **(1) 适配器模式** ```cpp class LegacySystem { public: void oldMethod() { /*...*/ } }; class Adapter : public TargetInterface { private: LegacySystem adaptee; public: void newMethod() override { adaptee.oldMethod(); } }; ``` **(2) 桥接模式** ```cpp class Implementation { public: virtual void execute() = 0; }; class Abstraction { protected: std::shared_ptr<Implementation> impl; public: Abstraction(Implementation* p) : impl(p) {} virtual void operation() { impl->execute(); } }; ``` --- #### 3. 行为型模式 **目标**:优化对象间的交互方式 **(1) 观察者模式(现代C++实现)** ```cpp class Subject { std::vector<std::function<void()>> observers; public: void attach(std::function<void()> obs) { observers.push_back(obs); } void notify() { for(auto& obs : observers) obs(); } }; ``` **(2) 策略模式** ```cpp template<typename Strategy> class Context { Strategy strategy; public: void execute() { strategy.doAlgorithm(); } }; ``` --- ### 三、C++特性对设计模式的影响 1. **模板的应用**: - 编译时多态替代运行时多态 - 策略模式/模板方法模式的混合使用 2. **智能指针**: ```cpp std::shared_ptr<Observer> obs = std::make_shared<ConcreteObserver>(); ``` 自动管理观察者生命周期 3. **移动语义**: ```cpp Factory::createProduct() && { /* 转移所有权 */ } ``` 优化工厂模式的对象返回 --- ### 四、应用建议 1. **适用场景判断**: - 当系统存在**高频变化需求**时(如UI组件扩展) - 需要**解耦复杂依赖**时(如模块通信) 2. **反模式警示**: - 避免过度设计(如简单场景使用抽象工厂) - 单例模式的全局状态污染问题 - 虚函数带来的性能损耗需权衡 --- ### 五、现代C++演进 1. **Lambda表达式**简化命令模式实现 2. **类型擦除技术**(如`std::any`)增强适配器灵活性 3. **概念约束**(C++20)改进模板策略的安全性 通过合理运用设计模式,可以显著提升C++代码的**可维护性**和**扩展性**,但需始终遵循**简洁性优先**原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值