桥接模式和组合模式的区别

        桥接模式(Bridge Pattern)和组合模式(Composite Pattern)都是结构型设计模式,旨在解决对象结构的复杂性问题,但它们的应用场景和目的有所不同。以下是它们的区别:

1. 定义与目的

桥接模式(Bridge Pattern):

  • 定义:将抽象部分与它的实现部分分离,使它们可以独立地变化。
  • 目的:主要解决在多维度变化情况下,类的爆炸性增长问题。通过将两个或多个维度的变化分离到不同的类层次中,从而使得系统更具灵活性。

组合模式(Composite Pattern):

  • 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
  • 目的:主要解决对象的层次结构问题,使得客户端可以一致地处理单个对象和组合对象。

2. 主要使用场景

桥接模式:

  • 当一个类有多个变化维度,并且这些维度需要独立变化时使用桥接模式。例如,一个图形类可能有形状和颜色两个变化维度,那么可以将形状和颜色分离为两个独立的层次结构。
  • 当不希望在抽象和实现之间产生紧耦合时。

组合模式:

  • 当需要表示对象的部分-整体层次结构时使用组合模式。
  • 当希望客户端可以统一地处理单个对象和组合对象时。

3. 结构区别

        桥接模式:包含两个独立的层次结构,一个是抽象部分,一个是实现部分。抽象部分包含对实现部分的引用。

        组合模式:包含一个对象树的层次结构,叶子节点表示基本对象,组合节点表示容器对象。容器对象可以包含叶子节点或其他容器节点。

4. 示例代码对比

桥接模式(Bridge Pattern)

        目的:将抽象部分与它的实现部分分离,使它们可以独立地变化。

类比

        想象一下,你在设计一种绘图应用程序,这个应用程序可以绘制不同种类的形状(例如,圆形和方形),而每种形状可以用不同的颜色来绘制(例如,红色和蓝色)。在这种情况下,形状与颜色是两个独立的维度。

如果不用桥接模式,你可能会为每种情况创建一个类:

  • 红色的圆形
  • 蓝色的圆形
  • 红色的方形
  • 蓝色的方形

        这样类的数量会随着形状和颜色的增加而成倍增长(组合爆炸)。

桥接模式的解决方案:

        将形状和颜色分开处理。你创建一个形状的抽象类,并且它包含一个颜色的接口。然后你可以独立地扩展形状和颜色。

// 颜色接口
class Color {
public:virtual std::string fill() const = 0;virtual ~Color() = default;
};class Red : public Color {
public:std::string fill() const override {return "红色";}
};class Blue : public Color {
public:std::string fill() const override {return "蓝色";}
};// 形状抽象类
class Shape {
protected:std::shared_ptr<Color> color;
public:Shape(std::shared_ptr<Color> col) : color(col) {}virtual std::string draw() const = 0;virtual ~Shape() = default;
};class Circle : public Shape {
public:Circle(std::shared_ptr<Color> col) : Shape(col) {}std::string draw() const override {return "绘制一个" + color->fill() + "的圆形";}
};class Square : public Shape {
public:Square(std::shared_ptr<Color> col) : Shape(col) {}std::string draw() const override {return "绘制一个" + color->fill() + "的方形";}
};// 使用
int main() {std::shared_ptr<Color> red = std::make_shared<Red>();std::shared_ptr<Color> blue = std::make_shared<Blue>();std::shared_ptr<Shape> redCircle = std::make_shared<Circle>(red);std::shared_ptr<Shape> blueSquare = std::make_shared<Square>(blue);std::cout << redCircle->draw() << std::endl; // 输出: 绘制一个红色的圆形std::cout << blueSquare->draw() << std::endl; // 输出: 绘制一个蓝色的方形return 0;
}

组合模式(Composite Pattern)

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

类比

        想象一下,你在设计一个公司组织架构,这个组织架构中有部门和员工。部门可以包含子部门和员工,子部门又可以包含员工或更多的子部门,形成一个树形结构。

组合模式的解决方案:

        你创建一个通用的组件接口,它可以表示部门和员工,然后通过组合对象来表示部门,通过叶子对象来表示员工。

#include <iostream>
#include <vector>
#include <memory>
#include <algorithm>// 组件接口
class Employee {
public:virtual void showDetails() const = 0;virtual void add(std::shared_ptr<Employee> employee) {}virtual void remove(std::shared_ptr<Employee> employee) {}virtual ~Employee() = default;
};// 叶子节点
class Developer : public Employee {
private:std::string name;
public:Developer(const std::string& devName) : name(devName) {}void showDetails() const override {std::cout << "开发者: " << name << std::endl;}
};// 叶子节点
class Designer : public Employee {
private:std::string name;
public:Designer(const std::string& desName) : name(desName) {}void showDetails() const override {std::cout << "设计师: " << name << std::endl;}
};// 容器节点
class Manager : public Employee {
private:std::string name;std::vector<std::shared_ptr<Employee>> subordinates;
public:Manager(const std::string& mgrName) : name(mgrName) {}void showDetails() const override {std::cout << "经理: " << name << std::endl;for (const auto& subordinate : subordinates) {subordinate->showDetails();}}void add(std::shared_ptr<Employee> employee) override {subordinates.push_back(employee);}void remove(std::shared_ptr<Employee> employee) override {subordinates.erase(std::remove(subordinates.begin(), subordinates.end(), employee), subordinates.end());}
};// 使用
int main() {std::shared_ptr<Employee> dev1 = std::make_shared<Developer>("Alice");std::shared_ptr<Employee> dev2 = std::make_shared<Developer>("Bob");std::shared_ptr<Employee> des1 = std::make_shared<Designer>("Charlie");std::shared_ptr<Manager> mgr1 = std::make_shared<Manager>("Dave");mgr1->add(dev1);mgr1->add(dev2);mgr1->add(des1);std::shared_ptr<Employee> des2 = std::make_shared<Designer>("Eve");std::shared_ptr<Manager> generalManager = std::make_shared<Manager>("Frank");generalManager->add(mgr1);generalManager->add(des2);generalManager->showDetails();// 输出:// 经理: Frank// 经理: Dave// 开发者: Alice// 开发者: Bob// 设计师: Charlie// 设计师: Evereturn 0;
}

总结

  • 桥接模式:
    • 用于分离抽象和实现,使它们可以独立变化。
    • 适用于多维度变化的场景,如形状和颜色的组合。
  • 组合模式:
    • 用于构建对象的树形结构,使得单个对象和组合对象可以一致地处理。
    • 适用于表示部分-整体层次结构的场景,如公司组织架构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35927.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

King’s Biobank 生物样本库管理系统:高效、智能的样本管理解决方案

近年来&#xff0c;生物样本资源已成为生物医药产业和国家生物安全战略的核心基石&#xff0c;在病因研究、临床诊疗及疾病预防等多个关键领域发挥着不可替代的作用。然而&#xff0c;科研机构、检测中心和医院在样本管理方面普遍面临以下挑战&#xff1a; 重复记录&#xff0c…

spring下的beanutils.copyProperties实现深拷贝

spring下的beanutils.copyProperties方法是深拷贝还是浅拷贝&#xff1f;可以实现深拷贝吗&#xff1f; 答案&#xff1a;浅拷贝。 一、浅拷贝深拷贝的理解 简单说拷贝就是将一个类中的属性拷贝到另一个中&#xff0c;对于BeanUtils.copyProperties来说&#xff0c;你必须保…

Linux---对缓冲区的简单理解--第一个系统程序

前序&#xff1a; 首先先理解一下什么是回车与换行&#xff1b;回车和换行是两个概念&#xff0c;它们不是一个东西&#xff1b; 回车:光标回到开始&#xff1b;换行:换到下一行&#xff1b; 如下图&#xff1a; 行缓冲区 如何理解缓冲区问题&#xff1f; 可以认为&#xff0…

『RabbitMQ』 windows下 安装RabbitMQ 并在Python中使用测试

目录 1. 安装ERLANG2. 安装RabbitMQ3. 新建用户Python的测试代码 生产者和消费者总结欢迎关注 『RabbitMQ』 专栏,持续更新中 欢迎关注 『RabbitMQ』 专栏,持续更新中 1. 安装ERLANG 下载之前先看兼容性,这里我打算下载26.1版本的Erlang以适配RabbitMQ cloud.emqx.com/cons…

【教程】创建NVIDIA Docker共享使用主机的GPU

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 这套是我跑完整理的。直接上干货&#xff0c;复制粘贴即可&#xff01; # 先安装toolkit sudo apt-get update sudo apt-get install -y ca-certifica…

麒麟信安受邀参加重庆教育装备专家培训会,共探教育信息化发展新趋势

近日&#xff0c;重庆市教育装备协会2024年区教育装备专家培训会举行&#xff0c;重庆各区教育信息技术与装备中心、教育委员会等相关领导参加。会上&#xff0c;麒麟信安作为协会成员单位发表主题演讲&#xff0c;与参会嘉宾深入探讨教育信息化工作的创新做法和实践经验&#…

2025澄迈漓岛音乐节品牌招商大会成功举行

——共谋音乐盛事&#xff0c;携手推动文化经济发展 12月6日&#xff0c;“2025澄迈漓岛音乐节品牌招商大会”&#xff08;以下简称“招商大会”&#xff09;在澄迈举行。本次大会由澄迈福山发展有限公司、福山咖啡文化风情镇旅游区联合主办&#xff0c;海南绿发投资有限公司承…

从零开始学TiDB(1) 核心组件架构概述

首先TiDB深度兼容MySQL 5.7 1. TiDB Server SQL语句的解析与编译&#xff1a;首先一条SQL语句最先到达的地方是TiDB Server集群&#xff0c;TiDB Server是无状态的&#xff0c;不存储数据&#xff0c;SQL 发过来之后TiDB Server 负责 解析&#xff0c;优化&#xff0c;编译 这…

调度算法的评价指标

调度算法的评价指标 一、CPU利用率二、系统吞吐量三、周转时间四、等待时间五、响应时间 一、CPU利用率 C P U 的利用率 C P U 有效工作时间 C P U 有效工作时间 C P U 空闲等待时间 CPU的利用率\dfrac{CPU有效工作时间}{CPU有效工作时间CPU空闲等待时间} CPU的利用率CPU有效…

【SpringBoot】SpringBoot中分页插件(PageHelper)的使用

目录 1.分页概念 2.原生写法 3.PageHelper插件分页查询 3.1 介绍 3.2?使用 3.3 Page对象和PageInf对象 1.分页概念 用户查询的数据不可能一次性全部展示给用户&#xff08;如果用户有一万条数据呢&#xff09;&#xff0c;而是分页展示给用户&#xff0c;这就是分页查询…

python操作数据库

文章目录 基础使用数据插入 基础使用 python使用第三方库pymysql来操作mysql数据库 安装&#xff1a; pip install pymysqlfrom pymysql import Connection# 获取到MySQL数据库的链接对象conn Connection(hostlocalhost # 主机名,port3306 # 端口&#xff0c;默…

【01】栅格切片服务发布

本文探讨的是使用GeoScene Server本身的能力去切瓦片&#xff0c;它可以很好地通过server自带的CachingTools GP服务去切片&#xff0c;可以通过调整该gp服务的最大实例数能够更好利用server所在机器cpu的能力&#xff1b; 如果server站点已经发布了很多服务&#xff0c;则不建…

非极大值抑制(Non-Maximum Suppression,简称NMS)是什么?

非极大值抑制&#xff08;Non-Maximum Suppression&#xff0c;简称NMS&#xff09;是一种常用于目标检测任务中的后处理技术&#xff0c;主要用于从多个候选框中选出最合适的边界框&#xff0c;并抑制那些与最优候选框重叠度高且分类置信度低的框。 NMS的目的&#xff1a; 在…

【Java】A *算法的应用

代码和测试图片下载地址&#xff1a; https://download.csdn.net/download/r77683962/90089371 这个地图里黑色部分是不能通过的&#xff0c;白色部分是可以通过的&#xff0c;这个算法没问题&#xff0c;有点感觉效率不太高。。。。。 效果&#xff1a; 源代码PathFind.java&…

日本IT|企业需要什么样的技术?

日本IT企业所需的技术非常多样化&#xff0c;涵盖了多个领域和方面。以下是一些日本IT企业通常所需的主要技术&#xff1a; 一、编程语言与工具 编程语言&#xff1a;Java、Python、C、C#、PHP等是日本IT企业常用的编程语言。这些语言在软件开发、数据分析、网络应用等方面都…

刘铁猛C#入门 030 泛型,partial类,枚举,结构

泛型(generic)无处不在 为什么需要泛型&#xff1a;避免成员膨胀或者类型膨胀 正交性&#xff1a;泛型类型(类/接口/委托/......)泛型成员(属性/方法/字段/....类型方法的参数推断 泛型接口/类的 类型参数不只有一个泛型与委托、lambda表达式实现泛型接口类时 &#xff0c;实现…

视频加密的好处与加密方法分析2024

视频内容的多样化不止局限于电视、电影&#xff0c;在日常培训学习中也是必不可少的。那么对于做知识付费的人来说&#xff0c;视频内容的安全性就尤为重要。视频加密也就i随之兴起&#xff0c;为视频内容安全多了一层保障&#xff0c;那么主要体现下那几个方面呢&#xff1f;可…

鸿蒙UI开发——亮/暗色模式适配

1、概 述 系统存在深浅色两种显示模式&#xff0c;为了给用户更好的使用体验&#xff0c;应用最好适配暗色和亮色两种模式。从应用与系统配置关联的角度来看&#xff0c;适配暗色和亮色模式可以分为下面两种情况&#xff1a; 应用跟随系统的深浅色模式&#xff1b; 应用主动设…

三菱伺服JET产品线(选型说明)

伺服放大器功能提升 伺服放大器MELSERVO-JET系列为进一步优化了独家控制引擎的高性能伺服放大器。 可通过与支持CC-LinK IE TSN的运动控制器的同步通信,进行高 速、高精度的运动控制。 除了旋转型伺服电机以外,还支持线性伺服电机。MR-JET-G-N1支持EtherCAT。 旋转型伺服电机 …

HarmonyNext如何判断上下分屏

鸿蒙系统支持上下分屏&#xff0c;可以同时使用两个应用&#xff0c;比如&#xff1a; 有时候我们需要在分屏的时候处理相关逻辑&#xff0c;那到底该如何处理了&#xff0c; 首先在UIAbility下的onWindowStageCreate中进行监听 //监听窗口变化let windowClass: window.Window…