【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)

简介: 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)

一、组合模式

1. 什么是组合模式

Composite Pattern,组合模式,是一种结构型模式。

组合模式将对象组合成树形结构以表示“整体-部分”的层次结构,并使得用户对单个对象和组合对象的使用具有一致性。

组合模式构造了一个树形的对象结构,并且通过一个属性对象可以可以访问整棵树的对象。

组合模式的三种角色:

  • Component:抽象角色,代表树形结构的抽象结点,它定义了所有实现类的统一接口(属性、方法、行为),并提供了访问和管理子结点的接口;简言之,Component定义了Leaf和Composite共同的操作接口,比如增加子结点,删除子结点等行为,是一个抽象基类。
  • Leaf:叶子结点,叶子结点中没有子结点,类似于树中的叶子结点,或文件系统中的文件。
  • Composite :枝结点,可以存储子结点,并实现子结点的操作,类似于文件系统的文件夹。

2. 组合模式案例

首先定义一个抽象类,为Leaf和Composite提供统一接口,假设要做一个文件系统,文件夹(Composite)中可以放入文件和文件夹,文件(Leaf)中不可以放入任何子结点。

1. class Component
2. {
3. public:
4.  virtual void display() = 0; //显示当前文件或文件夹名称
5.  virtual void add(Component* node) = 0; //在当前文件夹增加一个文件或文件夹
6.  virtual void remove(Component* node) = 0; //在当前文件夹删除一个文件或文件夹
7.  virtual vector<Component*>* get_child() = 0; //获取文件夹下属文件或文件夹
8. };

定义一个文件类,文件中不可加入子结点

1. class Leaf : public Component
2. {
3. private:
4.  string name;
5. public:
6.  Leaf(string name)
7.  {
8.    this->name = name;
9.  }
10.   virtual void display()
11.   {
12.     cout << "Leaf: " << this->name << endl;
13.   }
14.   virtual void add(Component* node)
15.   {
16.     cout << "叶子结点,无法加入" << endl;
17.   }
18.   virtual void remove(Component* node)
19.   {
20.     cout << "叶子结点,无此操作" << endl;
21.   }
22.   virtual vector<Component*>* get_child()
23.   {
24.     cout << "叶子结点,无子结点" << endl;
25.     return NULL;
26.   }
27. };

定义一个文件夹类,可以加入问价或文件夹

1. class Composite : public Component
2. {
3. private:
4.  string name;
5.  vector<Component*>* vec;
6. public:
7.  Composite(string name)
8.  {
9.    this->name = name;
10.     vec = new vector<Component*>;
11.   }
12.   ~Composite()
13.   {
14.     if (vec != NULL)
15.     {
16.       delete vec;
17.       vec = NULL;
18.     }
19.   }
20.   virtual void display()
21.   {
22.     cout << "Composite: " << this->name << endl;
23.   }
24.   virtual void add(Component* node)
25.   {
26.     vec->push_back(node);
27.   }
28.   virtual void remove(Component* node)
29.   {
30.     for (vector<Component*>::iterator it = vec->begin(); it != vec->end(); it++)
31.     {
32.       if (*it == node)
33.       {
34.         vec->erase(it);
35.       }
36.     }
37.   }
38.   virtual vector<Component*>* get_child()
39.   {
40.     cout << "*" << this->name << " child: " << "*\n";
41.     for (vector<Component*>::iterator it = vec->begin(); it != vec->end(); it++)
42.     {
43.       (*it)->display();
44.     }
45.     return vec;
46.   }
47. };

客户端操作

1. int main()
2. {
3.  Component* root = NULL;
4.  Leaf* l1 = NULL;
5.  Leaf* l2 = NULL;
6.  Composite* dir = NULL;
7. 
8.  root = new Composite("/root");
9.  l1 = new Leaf("1.cpp");
10.   l2 = new Leaf("2.cpp");
11.   dir = new Composite("/home");
12. 
13.   root->add(dir);
14.   dir->add(l1);
15.   dir->add(l2);
16. 
17.   cout << "============" << endl;
18.   root->display();
19.   root->get_child();
20.   dir->get_child();
21.   cout << "============" << endl;
22. 
23.   delete dir;
24.   delete l2;
25.   delete l1;
26.   delete root;
27. 
28.   system("pause");
29.   return 0;
30. }

二、桥接模式

1. 什么是桥接模式

Bridge Pattern,桥接模式,是一种结构型设计模式。

桥接模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

也就是说,通过桥接模式可以实现抽象部分与实现部分的解耦合,使得抽象和实现都可以独立的发生变化,当通过继承不能实现开闭原则的时候,就可以考虑桥接模式。比如,图形和颜色,把图形设计一个抽象类,颜色设计一个抽象类,然后根据需要的图形去实现图形类,并根据需要的颜色实现颜色类,通过两个抽象类就可以实现颜色和图形的组合。

  • Abstractions:抽象类接口,包含了一个对行为实现类Implementor的引用,也就是说二者具有关联关系。
  • Refined Abstraction:抽象类接口的实现类,实现了Abstractions中定义的接口,并可以调用Implementor中的方法(包含了Implementor的引用)。
  • Implementor:行为实现类接口,定义了一系列操作。
  • Concretelmp lementor:具体实现类,实现了Implementor中的操作。

2. 桥接模式案例

实现对不同图形上不同颜色,首先定义两个抽象类,颜色类和图形类

1. class Color
2. {
3. public:
4.  virtual void get_color() = 0;
5. };
6. 
7. class Graph
8. {
9. protected:
10.   Color* mGraphColor;
11. public:
12.   Graph(Color* mGraphColor)
13.   {
14.     this->mGraphColor = mGraphColor;
15.   }
16.   virtual void smear_color() = 0; //给图形上色
17. };

定义三个具体的颜色

1. class Red : public Color
2. {
3. public:
4.  virtual void get_color()
5.  {
6.    cout << "红色" << endl;
7.  }
8. };
9. 
10. class Blue : public Color
11. {
12. public:
13.   virtual void get_color()
14.   {
15.     cout << "蓝色" << endl;
16.   }
17. };
18. 
19. class Yellow : public Color
20. {
21. public:
22.   virtual void get_color()
23.   {
24.     cout << "黄色" << endl;
25.   }
26. };

实现具体的图形

1. class Circle : public Graph
2. {
3. public:
4.  Circle(Color* mGraphColor) : Graph(mGraphColor) {};
5.  virtual void smear_color()
6.  {
7.    cout << "圆形 + ";
8.    mGraphColor->get_color();
9.  }
10. };
11. 
12. class Triangle : public Graph
13. {
14. public:
15.   Triangle(Color* mGraphColor) : Graph(mGraphColor) {};
16.   virtual void smear_color()
17.   {
18.     cout << "三角形 + ";
19.     mGraphColor->get_color();
20.   }
21. };

客户端操作,为图形上色

1. int main()
2. {
3.  Color* m_color = NULL;
4. 
5.  m_color = new Red;
6.  Circle* m_circle = new Circle(m_color);
7.  m_circle->smear_color();
8. 
9.  delete m_color;
10.   m_color = new Blue;
11.   Triangle* m_triangle = new Triangle(m_color);
12.   m_triangle->smear_color();
13. 
14.   delete m_color;
15.   delete m_triangle;
16.   delete m_circle;
17. 
18.   system("pause");
19.   return 0;
20. }


相关文章
|
4月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
10天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3月前
|
设计模式 Java Kotlin
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
Kotlin学习笔记 - 改良设计模式 - 迭代器模式
37 2
|
4月前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
3月前
|
设计模式 JavaScript Scala
Kotlin学习笔记 - 改良设计模式 - 责任链模式
Kotlin学习笔记 - 改良设计模式 - 责任链模式
48 0
|
3月前
|
设计模式 Java Kotlin
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
Kotlin 学习笔记- 改良设计模式 - 装饰者模式
35 0
|
4月前
|
设计模式 存储 安全
Java设计模式-组合模式(13)
Java设计模式-组合模式(13)
|
4月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
4天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式