1.意图

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

2.动机

在抽象类与它的实现之间起到桥梁作用,使它们可以独立地变化。

3.适用性

  • 不希望在抽象和它的实现部分之间有一个固定的绑定关系。这种情况可能是因为,在程序运行时刻实现部分可以被选择或切换。
  • 类的抽象以及它的实现部分都应该可以通过生成子类的方式加以扩充。这时桥接模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。
  • 对一个抽象实现部分的修改的修改不应该对客户产生影响,即客户代码不必要重新编译。
  • 对客户完全隐藏抽象的实现部分。C++中类的表示在类接口中是可见的。
  • 有许多类要生成,这样一种类层次结构说明你必须将一个对象分解成两部分。

4.结构

5.代码实例

#include <memory>

class  AbstactionImpl;

class Abstration
{
public:
void virtual Operaion()=;
void virtual SetImpl(std::shared_ptr<AbstactionImpl>& pImpl)=;
protected: std::shared_ptr<AbstactionImpl> m_pImpl; }; class RedefinedAbstration : public Abstration
{
public:
void Operaion();
void SetImpl(std::shared_ptr<AbstactionImpl>& pImpl);
};
class AbstactionImpl
{
public:
void virtual OperationImpl()=;
}; class ConcreteImplentorA : public AbstactionImpl
{
public:
void OperationImpl();
}; class ConcreteImplentorB : public AbstactionImpl
{
public:
void OperationImpl();
};
#include "Abstration.h"
#include "Implentor.h" void RedefinedAbstration::Operaion()
{
m_pImpl->OperationImpl();
} void RedefinedAbstration::SetImpl(std::shared_ptr<AbstactionImpl>& pImpl)
{
m_pImpl = pImpl;
}
#include <iostream>
#include "Implentor.h" void ConcreteImplentorA::OperationImpl()
{
std::cout<<"ConcreteImplenorA Exectued" <<std::endl;
} void ConcreteImplentorB::OperationImpl()
{
std::cout<<"ConcreteImplentorB Exectued"<<std::endl;
}
#include <memory>
#include "Abstration.h"
#include "Implentor.h" int main()
{ std::shared_ptr<AbstactionImpl> pConcreteImplA(new ConcreteImplentorA);
std::shared_ptr<AbstactionImpl> pConcreteImplB(new ConcreteImplentorB); std::shared_ptr<RedefinedAbstration> pRedefinedAbstration(new RedefinedAbstration);
pRedefinedAbstration->SetImpl(pConcreteImplA);
pRedefinedAbstration->Operaion(); pRedefinedAbstration->SetImpl(pConcreteImplB);
pRedefinedAbstration->Operaion(); while(); }

6.测试结果

7.效果

  • 分离接口及其实现部分 一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。将Abstraction和Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译Abstaction类和它的客户程序。
  • 提高可扩充性 可以独立地对Abstraction和Implementor层次结构进行扩充。
  • 实现细节对客户透明 可以对客户隐藏实现细节。

最新文章

  1. 惊闻Java要收费之后
  2. combobox 属性、事件、方法
  3. 轻量级iOS蓝牙库:LGBluetooth(项目中用过的)
  4. CEF3开发者系列之JS与C++交互之二
  5. 琐碎的总结 css jQuery js 等等。。。
  6. 如何通过热修复,搞定开发中的那些 Bug?
  7. 【mysql的设计与优化专题(6)】mysql索引攻略
  8. 用CCRenderTexture和BlendFunc制作游戏教学时使用的黑色覆盖层
  9. activemq 的小实验
  10. Day8 面向对象(补充)
  11. Android模仿jquery异步请求
  12. 初探中间件(middleware)
  13. Django入门实践(三)
  14. 如何从本地把项目上传到github&amp;&amp;如何把github项目通过clone复制下来
  15. [转]亿级Web系统搭建:单机到分布式集群
  16. Java入门——(4)多线程
  17. win7 64位安装redis 及Redis Desktop Manager使用(转载的)
  18. MyBatis延迟加载及在spring中集成配置
  19. java基础----&gt;String中replace和replaceAll方法
  20. PC滚动条样式

热门文章

  1. valgind使用错误——检测不同位目标程序
  2. Activity之间数据交流(onActivityResult的用法)
  3. C#特性学习笔记二
  4. JS教程:获取当前地址栏URL
  5. DB设计原则(二)如何拆、分表
  6. zxing 一维码部分深入分析与实际应用,识别卡片数量,Android数卡器
  7. Happen-before
  8. (整理)SQLServer_DBA 工具
  9. (转)winform Form 淡入淡出效果
  10. FPGA基本原理之一