现在的位置: 首页 > 综合 > 正文

【设计模式】Bridge(桥接)

2013年10月25日 ⁄ 综合 ⁄ 共 1554字 ⁄ 字号 评论关闭
Bridge,将抽象部分与实现部分分离,使它们都可以独立地变化。


当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象接口,而具体的子类则用不同的方式加以实现。但是,继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
适用性:
  • 你不希望在抽象和它的实现部分之间有一个固定的绑定关系,在程序运行时刻实现部分可以被选择或者切换。
  • 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这样Bridge模式使你可以对不同的抽象接口和实现部分进行组合、扩充。
  • 对一个抽象的实现部分的修改应对客户不产生影响。
  • 你想对客户完全隐藏抽象的实现部分。
  • 你想将一个抽象对象的实现分解成两个部分
  • 你想在多个对象间共享实现,但同时要求客户并不知道这一点。
结构:

效果:
1. 分离接口及实现部分。一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。接口与实现分离有助于分层,从而产生更好的结构化系统。
2. 提高可扩充性。 可以独立地对Abstraction和Implementor层次结构进行扩充。
示例:

  • #include<iostream>

  • classImplementor
  • {
  • public:
  •    virtual void OperationImp()=0;
  • };

  • class ConcreteImplementorA: public Implementor
  • {
  • public:
  •    void OperationImp(){
  •        std::cout<<"ConcreteImplementorA::OperationImp()"<< std::endl;
  •    }
  • };

  • class ConcreteImplementorB: public Implementor
  • {
  • public:
  •    void OperationImp(){
  •        std::cout<<"ConcreteImplementorB::OperationImp()"<< std::endl;
  •    }
  • };

  • classAbstraction
  • {
  • public:
  •    virtual voidOperation(){_imp->OperationImp();}
  • protected:
  •    Abstraction(Implementor*imp):_imp(imp){}
  • private:
  •    Implementor* _imp;
  • };

  • class RefinedAbstraction :public Abstraction
  • {
  • public:
  •    virtual void someExtendOperation() =0;
  • protected:
  •    RefinedAbstraction(Implementor*imp):
  •    Abstraction(imp){}
  • };

  • class Implemention :public RefinedAbstraction
  • {
  • public:
  •    Implemention(Implementor*imp):RefinedAbstraction(imp){}
  •    voidsomeExtendOperation(){
  •        std::cout<<"Implemention::someExtendOperation()"<< std::endl;
  •    }
  • };

  • intmain()
  • {
  •    std::cout <<"Bridge test" <<std::endl;

  •    Implementor* imp = newConcreteImplementorB;
  •    RefinedAbstraction* ra = newImplemention(imp);
  •   ra->Operation();
  •   ra->someExtendOperation();

  •    return 0;
  • }

抱歉!评论已关闭.