你的位置:首页 > ASP.net教程

[ASP.net教程]Bridge(桥接)


1.意图

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

2.动机

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

3.适用性

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

4.结构

    

5.代码实例

    

#include <memory>class AbstactionImpl;class Abstration{public:  void virtual Operaion()=0;  void virtual SetImpl(std::shared_ptr<AbstactionImpl>& pImpl)=0;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()=0;};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(1);}

6.测试结果

    

7.效果

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