• 桥接模式 结构性模式之二


    1.定义

            将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

    2.应用场景

            比如这样一个项目:我们的目的是实例化一个带颜色的图形。其中图形包括:圆、正方形、三角形;颜色包括:红色、绿色和黄色。如果使用继承关系设计这个项目的类,我们可能需要:红色圆类,红色正方形类,红色三角形类;绿色圆类,绿色正方形类,绿色三角形类;黄色圆类,黄色正方形类,黄色三角形类。m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。

            如果使用桥接模式,我们只需要定义3个具体形状类:圆形、正方形、三角形;和3个具体颜色类:红色、绿色和黄色。这种处理方法看起来和装饰器模式有些类似(装饰器模式可以看笔者的另一篇文章),区别是这里面列举的颜色,并不是作为形状的装饰(或者是扩展部件),而是作为实例化带颜色的图形的必要部分,注意是必要部分如果我们要完成实例化,就必须要明确形状+颜色,二者缺一不可。在下面的代码实现中也可以看到这一点。

    3.示例代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. //颜色抽象类
    6. class Color
    7. {
    8. public:
    9. virtual ~Color() {};
    10. virtual void DoPaint(string shape) = 0;
    11. };
    12. //红色类
    13. class Red : public Color
    14. {
    15. virtual void DoPaint(string shape)
    16. {
    17. cout << "画图:红色的" << shape.c_str() << endl;
    18. }
    19. };
    20. //绿色类
    21. class Green : public Color
    22. {
    23. virtual void DoPaint(string shape)
    24. {
    25. cout << "画图:绿色的" << shape.c_str() << endl;
    26. }
    27. };
    28. //黄色类
    29. class Yellow : public Color
    30. {
    31. virtual void DoPaint(string shape)
    32. {
    33. cout << "画图:黄色的" << shape.c_str() << endl;
    34. }
    35. };
    36. //形状-桥接类
    37. class Shape
    38. {
    39. public:
    40. Shape(Color* color) : _color(color) {}
    41. virtual ~Shape() {}
    42. virtual void draw() = 0;
    43. void draw(string shape)
    44. {
    45. _color->DoPaint(shape);
    46. }
    47. private:
    48. Color* _color;
    49. };
    50. //圆
    51. class Circle : public Shape
    52. {
    53. public:
    54. Circle(Color* color) : Shape(color) {}
    55. virtual void draw()
    56. {
    57. Shape::draw("圆");
    58. }
    59. };
    60. //正方形
    61. class Square : public Shape
    62. {
    63. public:
    64. Square(Color* color) : Shape(color) {}
    65. virtual void draw()
    66. {
    67. Shape::draw("正方形");
    68. }
    69. };
    70. //三角形
    71. class Triangle : public Shape
    72. {
    73. public:
    74. Triangle(Color* color) : Shape(color) {}
    75. virtual void draw()
    76. {
    77. Shape::draw("三角形");
    78. }
    79. };
    80. int main()
    81. {
    82. Shape* sh = new Triangle(new Green());
    83. sh->draw();
    84. system("pause");
    85. return 0;
    86. }

    4.引用

    https://blog.csdn.net/ymhdt/article/details/124340672

     

     

  • 相关阅读:
    曲线拟合 | MATLAB实现基于贝叶斯多项式的曲线拟合
    java学习之springcloud之服务调用+服务降级+服务网关篇
    vue3在setup中获取DOM元素
    Autofac 注入仓储模式
    【python】爬虫系列之lxml库介绍和xpath提取网页数据
    SSM+人才交流平台 毕业设计-附源码221022
    Leetcode Daily Challenge 1845. Seat Reservation Manager
    3389,为了保障3389端口的安全,我们可以采取的措施
    flutter开发入门,windows环境安装,耗时一天解决各种bug,终于成功
    全球产业链:脑机接口产业链
  • 原文地址:https://blog.csdn.net/Physics_ITBoy/article/details/133312131