目录

一、组合模式

1. 什么是组合模式

2. 组合模式案例

二、桥接模式

1. 什么是桥接模式

2. 桥接模式案例


一、组合模式

1. 什么是组合模式

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

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

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

组合模式的三种角色:

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

2. 组合模式案例

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

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

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

class Leaf : public Component
{
private:string name;
public:Leaf(string name){this->name = name;}virtual void display(){cout << "Leaf: " << this->name << endl;}virtual void add(Component* node){cout << "叶子结点,无法加入" << endl;}virtual void remove(Component* node){cout << "叶子结点,无此操作" << endl;}virtual vector<Component*>* get_child(){cout << "叶子结点,无子结点" << endl;return NULL;}
};

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

class Composite : public Component
{
private:string name;vector<Component*>* vec;
public:Composite(string name){this->name = name;vec = new vector<Component*>;}~Composite(){if (vec != NULL){delete vec;vec = NULL;}}virtual void display(){cout << "Composite: " << this->name << endl;}virtual void add(Component* node){vec->push_back(node);}virtual void remove(Component* node){for (vector<Component*>::iterator it = vec->begin(); it != vec->end(); it++){if (*it == node){vec->erase(it);}}}virtual vector<Component*>* get_child(){cout << "*" << this->name << " child: " << "*\n";for (vector<Component*>::iterator it = vec->begin(); it != vec->end(); it++){(*it)->display();}return vec;}
};

客户端操作

int main()
{Component* root = NULL;Leaf* l1 = NULL;Leaf* l2 = NULL;Composite* dir = NULL;root = new Composite("/root");l1 = new Leaf("1.cpp");l2 = new Leaf("2.cpp");dir = new Composite("/home");root->add(dir);dir->add(l1);dir->add(l2);cout << "============" << endl;root->display();root->get_child();dir->get_child();cout << "============" << endl;delete dir;delete l2;delete l1;delete root;system("pause");return 0;
}

二、桥接模式

1. 什么是桥接模式

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

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

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

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

2. 桥接模式案例

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

class Color
{
public:virtual void get_color() = 0;
};class Graph
{
protected:Color* mGraphColor;
public:Graph(Color* mGraphColor){this->mGraphColor = mGraphColor;}virtual void smear_color() = 0; //给图形上色
};

定义三个具体的颜色

class Red : public Color
{
public:virtual void get_color(){cout << "红色" << endl;}
};class Blue : public Color
{
public:virtual void get_color(){cout << "蓝色" << endl;}
};class Yellow : public Color
{
public:virtual void get_color(){cout << "黄色" << endl;}
};

实现具体的图形

class Circle : public Graph
{
public:Circle(Color* mGraphColor) : Graph(mGraphColor) {};virtual void smear_color(){cout << "圆形 + ";mGraphColor->get_color();}
};class Triangle : public Graph
{
public:Triangle(Color* mGraphColor) : Graph(mGraphColor) {};virtual void smear_color(){cout << "三角形 + ";mGraphColor->get_color();}
};

客户端操作,为图形上色

int main()
{Color* m_color = NULL;m_color = new Red;Circle* m_circle = new Circle(m_color);m_circle->smear_color();delete m_color;m_color = new Blue;Triangle* m_triangle = new Triangle(m_color);m_triangle->smear_color();delete m_color;delete m_triangle;delete m_circle;system("pause");return 0;
}

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

  1. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  2. 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)

    概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引 ...

  3. 设计模式学习笔记——组合(Composite)模式

    设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...

  4. 设计模式学习笔记——抽象工厂(Abstract Factory)模式

    设计模式学习笔记--抽象工厂(Abstract Factory)模式 @(设计模式)[设计模式, 设计模式中文名, 设计模式英文名] 设计模式学习笔记抽象工厂Abstract Factory模式 基本 ...

  5. Ext.Net学习笔记22:Ext.Net Tree 用法详解

    上面的图片是一个简单的树,使用Ext.Net来创建这样的树结构非常简单,代码如下: <ext:TreePanel runat="server"><Root> ...

  6. python列表和元组的应用_python学习笔记之列表(list)与元组(tuple)详解

    前言 最近重新再看python的基础知识,感觉自己还是对于这些知识很陌生,需要用的时候还是需要翻书查阅,还是先注重基础吧--我要重新把python的教程阅读一遍,把以前自己忽略的部分学习,加强练习和记 ...

  7. 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

    本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...

  8. 【matcovnet学习笔记】objective,top1error,top5error详解

    [matcovnet学习笔记]objective,top1error,top5error详解 排名前1和前5的错误率是衡量某些解决方案成功与否的重要单位 ,要理解这三个概念,关键是要看懂下面这个多类误 ...

  9. C#设计模式学习笔记:(20)职责链模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8109100.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第八个模式--职 ...

  10. 步步为营 .NET 设计模式学习笔记 九、Command(命令模式)

    概述 在软件系统中,"行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务& ...

最新文章

  1. 不知道为什么,很多优秀的产品知道人确很少
  2. Android9.0 http网络请求失败问题的处理
  3. 李航老师亲自推荐的《统计学习方法》课件下载
  4. html 调用c#dll中的控件,C#实现反射调用动态加载的DLL文件中的方法和在窗体中加载DLL文件的用户控件...
  5. 循环队列 - 顺序存储结构
  6. 项目缺少包如何和服务器,解决缺少服务器依赖包问题
  7. 【转】ACE开发环境搭建
  8. JAR 文件规范详解
  9. Oracle10g安装教程、配置实例、监听、客户端程序详解_Windows篇
  10. 分享100个精美模板PPT模板,总有一款适合你
  11. Lintcode 尾部的零
  12. 从零开始学JAVA:一、Java语言概述
  13. SAP PI PO XSLT Mapping of Adapter-Specific Message Attributes
  14. 三年高级开发,六年成为架构师,到CTO我用了12年
  15. 真正卓越的领导者,都有这6大共性
  16. 一文说明前端和后端的区别、职业发展以及就业前景!
  17. Android利用百度地图API实现定位功能(记录)
  18. 微信授权登陆【yixiyun】
  19. 实战:k8s中网络策略实验(成功测试-博客输出)-20211005
  20. BZOJ 3609: [Heoi2014]人人尽说江南好

热门文章

  1. m4b格式 android,新星安卓手机格式转换器
  2. Spring AOP中定义切点PointCut详解
  3. D Mocha and Railgun
  4. 蓝桥杯Java——算法训练(ALGO986-996)
  5. 基于局域网的超简易即时通讯软件(二)
  6. 校园共享打印机小程序开发
  7. 炒股经常用到的几个工具网站
  8. 量化交易 米筐 财务数据与定时器
  9. 基于简单神经网络模型的鸢尾花分类问题
  10. keras中EarlyStopping