c++涉及模式 桥接模式(bridge Pattern)

c++涉及模式 桥接模式(bridge Pattern)
考虑这样一个问题:
需要获得一个图形,这个图形可以是圆形,可以是正方形,可以使长方形其颜色可以是蓝色可以是红色可以是绿色,如果这种情况下将设计写死,那么可以
看到有3*3=9 个类,但是图形和颜色更多呢?那么成为一个基本不能完成的任务,那么在这种情况下我们就需一种叫做桥接的设计模式,它的原理同样是
通过虚函数进行解耦合,实现方式 图形抽象类通过一个输入颜色抽象类的指针(依赖)来代表颜色,然后通过保存在一个聚合的颜色抽象类指针成员中,这里
通过这两图形抽象类和颜色抽象类进行解耦合,同时能够实现任何颜色和任何图形之间的组合,也是非常神奇的一种设计模式
下面是模式图:
c++涉及模式 桥接模式(bridge Pattern)


下面是上面问题的代码实现:
输出为:

I'm bule rectangle

I'm red rectangle

I'm green square

I'm bule square


代码:

点击(此处)折叠或打开

  1. #include<iostream>
  2. using namespace std;

  3. //颜色虚接口
  4. class colour
  5. {
  6. public:
  7.     virtual void getcol() = 0;
  8.     virtual ~colour(){};
  9. };

  10. //形状虚接口
  11. class graph
  12. {
  13. public:
  14.     virtual void setcol(colour* col) = 0; //依赖 桥接
  15.     virtual ~graph(){};
  16. protected:
  17.     colour* col; //聚合 桥接
  18. };

  19. //颜色具体实现
  20. class red:public colour
  21. {
  22. public:
  23.     virtual void getcol()
  24.     {
  25.         cout<<"I'm red ";
  26.     }
  27.     virtual ~red(){};
  28. };


  29. class bule:public colour
  30. {
  31. public:
  32.     virtual void getcol()
  33.     {
  34.         cout<<"I'm bule";
  35.     }
  36.     virtual ~bule(){};
  37. };

  38. class green:public colour
  39. {
  40. public:
  41.     virtual void getcol()
  42.     {
  43.         cout<<"I'm green ";
  44.     }
  45.     virtual ~green(){};
  46. };

  47. //形状具体实现并且桥接到颜色

  48. class square:public graph
  49. {
  50. public:
  51.     square()
  52.     {
  53.        this->col = NULL ;
  54.     }

  55.     virtual void setcol(colour* col)
  56.     {
  57.         this->col = col;
  58.     }
  59.     void print()
  60.     {
  61.         this->col->getcol();
  62.         cout<<" square\n";
  63.     }
  64.     virtual ~square(){};
  65. };


  66. class triangle:public graph
  67. {
  68.  public:
  69.    triangle()
  70.    {
  71.       this->col = NULL ; ;
  72.    }
  73.     virtual void setcol(colour* col)
  74.     {
  75.         this->col = col;
  76.     }
  77.     void print()
  78.     {
  79.         this->col->getcol();
  80.         cout<<" triangle\n";
  81.     }
  82.     virtual ~triangle(){};
  83. };

  84. class rectangle:public graph
  85. {
  86.     public:
  87.     rectangle()
  88.     {
  89.        this->col = NULL ;
  90.     }
  91.     virtual void setcol(colour* col)
  92.     {
  93.         this->col = col;
  94.     }
  95.     void print()
  96.     {
  97.         this->col->getcol();
  98.         cout<<" rectangle\n";
  99.     }
  100.     virtual ~rectangle(){};
  101. };


  102. int main(void)
  103. {
  104.     bule tblue;
  105.     red tred;
  106.     green tgreen;

  107.     rectangle trectangle;
  108.     trectangle.setcol(&tblue); //任意组合
  109.     trectangle.print();
  110.     trectangle.setcol(&tred); //任意组合
  111.     trectangle.print();

  112.     square tsquare;
  113.     tsquare.setcol(&tgreen); //任意组合
  114.     tsquare.print();
  115.     tsquare.setcol(&tblue); //任意组合
  116.     tsquare.print();
  117. }
作者微信:

               c++涉及模式 桥接模式(bridge Pattern)
上一篇:lighttpd 笔记


下一篇:【云栖大会】阿里云和红帽达成合作为百万级客户提供更多企业级解决方案