桥接模式【结构型模式C++】

ops/2024/9/23 9:20:58/

1.概述

桥接模式是一种结构型设计模式,是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

       这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类,这两种类型的类可被结构化改变而互不影响。

  

2.结构

  • 抽象(Abstraction): 该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
  • 修正抽象(RefinedAbstraction): Abstraction的具体实现,对Abstraction的方法进行完善和扩展;
  • 实现(Implementor): 确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或者抽象类;
  • 具体实现(ConcreteImplementor): Implementor的具体实现;

3.实现

       假设你有一个几何 形状Shape类, 从它能扩展出两个子类: ​ 圆形Circle 方形Square 。 如果继续对这样的类层次结构进行扩展以使其包含颜色, 创建名为 红色Red蓝色Blue的形状子类。由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合,具体为蓝色圆形、红色圆形、蓝色方形红色方形 

        从上述例子可知每增加一种颜色或者一种形状将导致代码复杂程度指数增长。 如此以往, 情况会越来越糟糕。    

      桥接模式通过将继承改为组合的方式来解决这个问题。 具体来说, 就是抽取其中一个维度并使之成为独立的类层次, 这样就可以在初始类中引用这个新层次的对象, 从而使得一个类不必拥有所有的状态和行为。

        根据该方法, 我们可以将颜色相关的代码抽取到拥有 红色和 蓝色两个子类的颜色类中, 然后在 形状类中添加一个指向某一颜色对象的引用成员变量。 现在, 形状类可以将所有与颜色相关的工作委派给连入的颜色对象。 这样的引用就成为了 形状和 颜色之间的桥梁。 此后, 新增颜色将不再需要修改形状的类层次, 反之亦然。 

3.1具体实现

 类图如下:

#include <iostream>
using namespace std;class Color {
public:virtual void Spray() = 0;
};class Red :public Color {public:void Spray() override {cout << "喷涂红色..." << endl;}
};class Blue :public Color {public:void Spray() override {cout << "喷涂红色..." << endl;}};class Shape {protected:Color* color_;
public:Shape(Color* color) : color_(color) {}virtual void draw()  {cout <<"Abstraction: Base draw ... \n" << endl;return ;}};class Circle :public Shape {public:Circle(Color* color) : Shape(color) {}void draw()  override {cout << "画圆形..." << endl;color_->Spray();}
};int main()
{cout << "------桥接模式------" << endl;Shape *shape1 = new Circle(new Red());shape1->draw();Shape *shape2 = new Circle(new Blue());shape2->draw();return 0;
}
3.2运行结果  

4.状态设计模式优缺点 

优点: 

  • 抽象和实现的分离。
  • 优秀的扩展能力。
  • 符合开闭原则、合成复用原则。

缺点:

       桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

5.应用场景

  • 当一个类需要在多个维度上变化时,使用继承会导致类极具增长时。
  • 当一个类需要独立地变化其抽象部分和实现部分时。
  • 当需要在抽象部分和实现部分之间建立一种透明的连接关系时。

http://www.ppmy.cn/ops/3676.html

相关文章

语言模型的发展

文章目录 语言模型的发展历程大语言模型的能力特点大语言模型关键技术概览大语言模型对科技发展的影响 语言模型的发展历程 一般来说&#xff0c;语言模型旨在对于人类语言的内在规律进行建模&#xff0c;从而准确预测词序列中未来&#xff08;或缺失&#xff09;词或词元&…

【无标题】PHP-parse_str变量覆盖

[题目信息]&#xff1a; 题目名称题目难度PHP-parse_str变量覆盖1 [题目考点]&#xff1a; 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值&#xff0c;一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有&#xff1a;$$&…

JWT原理

为什么会有JWT的出现&#xff1f; 首先不得不提到一个知识叫做跨域身份验证&#xff0c;JWT的出现就是为了更好的解决这个问题&#xff0c;但是在没有JWT的时候&#xff0c;我们一般怎么做呢&#xff1f;一般使用Cookie和Session&#xff0c;流程大体如下所示&#xff1a; 用…

【LeetCode热题100】【动态规划】最长递增子序列

题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 让dp[i]是以nums[i]为结尾的子序列的最长递增长度&#xff0c;遍历nums[i]之前的元素&#xff0c;如果有比nums[i]小的&#xff0c;说明递增子序列可以延申 class Solution { public:int le…

web3项目自动连接小狐狸以及小狐狸中的各种“地址”详解

刚做web3的时候&#xff0c;比较迷糊的就是人们口中说的各种地址&#xff0c;小狐狸钱包地址&#xff0c;私钥地址&#xff0c;跳转地址&#xff0c;接口地址&#xff0c;交易地址&#xff0c;等等XX地址&#xff0c;常常感觉跟做链的同事们说话不在一个频道。 这一小节&#x…

Java抽象类

1. 抽象类 1.1 抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的。 一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。 在打印图形例子中, 我们…

K8S 哲学 - yaml文件

selector&#xff1a; Pod 对象不应该有 selector 字段。selector 字段通常用于 Service、Deployment、ReplicaSet 等对象&#xff0c;用于选择匹配的 Pod。在 Pod 对象中&#xff0c;这个字段是无效的 apiVersion: apps/v1 kind: Deployment metadata: name: gyk labels: …

Labview2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW是一种由美国国家仪器&#xff08;NI&#xff09;公司开发的程序开发环境&#xff0c;它显著区别于其他计算机语言&#xff0c;如C和BASIC。传统的计算机语言是基于文本的语言来产生代码&#xff0c;而LabVIEW则采用图形化…