Bridge 桥接模式(结构型模式)

  桥接模式即将抽象部分与它的实现部分分离开来,使他们都可以独立变化。桥接模式将继承关系转化成关联关系,它降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量。将抽象部分与他的实现部分分离这句话不是很好理解,其实这并不是将抽象类与他的派生类分离,而是抽象类和它的派生类用来实现自己的对象。这样还是不能理解的话。我们就先来认清什么是抽象化,什么是实现化,什么是脱耦。  

  • 抽象化:其概念是将复杂物体的一个或几个特性抽出去而只注意其他特性的行动或过程。在面向对象就是将对象共同的性质抽取出去而形成类的过程。
  • 实现化:针对抽象化给出的具体实现。它和抽象化是一个互逆的过程,实现化是对抽象化事物的进一步具体化。
  • 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。
      实现系统可能有多个角度分类,每一种角度都可能变化,那么把这种多角度分类给分离出来让他们独立变化,减少他们之间耦合。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。

参与者

  • Abstraction 定义抽象类的接口
  • RedifinedAbstraction 扩充Abstraction定义的接口
  • Implementor定义实现类的接口
  • ConcreteImpeletmentor实现Impeletmentor接口并定义它的具体实现

实现代码

class Color{//Implementor
public:
    virtual std::string getColor(){
        return "";
    }
};
class Shape{//Abstraction 
public:
    void setColor(Color *c){
        color = c;
    }
    virtual void DrawPicture(){
    }
    Color *color;
};
class Shape1 : public Shape{//RedifinedAbstraction
    void DrawPicture() override {
        std::cout<<"Shape1 draw with "<<color->getColor()<<std::endl;
    }
};

class Shape2 :public Shape{//RedifinedAbstraction
    void DrawPicture() override {
        std::cout<<"Shape2 draw with "<<color->getColor()<<std::endl;
    }
};

class  Red :public Color{//ConcreteImpeletmentor
    std::string getColor() override {
      return  std::string("red");
    }
};

class Black :public Color{//ConcreteImpeletmentor
    std::string getColor() override{
       return std::string("black");
    }
};

int main()//client
{
    Shape *s1 =new Shape1();
    Shape *s2 =new Shape2();
    Color *c1 =new Red();
    Color *c2 =new Black();
    s1->setColor(c1);
    s1->DrawPicture();
    s2->setColor(c1);
    s2->DrawPicture();
    s2->setColor(c2);
    s2->DrawPicture();
}

效果

  • 分离效果及实现部分
  • 提高可扩充性
  • 实现细节对客户端透明

参考

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.初识桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化。 Abstraction:抽象部分的接口。...
    王侦阅读 945评论 0 7
  • 【学习难度:★★★☆☆,使用频率:★★★☆☆】直接出处:桥接模式梳理和学习:https://github.com/...
    BruceOuyang阅读 961评论 0 2
  • 一、应用场景 设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色...
    QuantRuu阅读 794评论 0 51
  • 在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够...
    justCode_阅读 1,808评论 0 7
  • 本文参考:http://www.oschina.net/question/1436074_140456 http:...
    端木轩阅读 3,630评论 0 5