设计模式C++实现20: 桥接模式(Bridge)

news2025/2/23 5:10:11

部分内容参考大话设计模式第22章;本实验通过C++语言实现。  

一 基本原理 

意图:将抽象部分和实现部分分离,使它们都可以独立变化。

上下文:某些类型由于自身的逻辑,具有两个或多个维度的变化。如何应对“多维度的变化”?如何使得该类型既能够沿着多个方向进行变化,又不引入额外的复杂度?

桥接模式静态类图 

 

Abstraction:定义抽象类的接口;维护一个指向Implementor类型对象的指针。RefinedAbstraction:扩充Abstraction定义的接口。 

Implementor:定义Implementor类型的接口,这个接口可以和Abstraction接口完全不同。一般而言,Implementor接口提供基本操作,而Abstraction接口定义较高层次的操作。ConcreteImplementor:实现Implementor接口。 

 

 

代码实现

#include <iostream>
#include <vector>
#include <mutex>
using namespace std;

class Implementor
{
public:
    virtual void Operation() = 0;
};
class ConcreteImplementorA:public Implementor
{


    // Implementor interface
public:
    void Operation()
    {
        cout << "ConcreteImplementorA" << endl;
    }
};
class ConcreteImplementorB:public Implementor
{


    // Implementor interface
public:
    void Operation()
    {
        cout << "ConcreteImplementorB" << endl;
    }
};

class Abstraction{
public:
    Implementor *implementor = nullptr;
    virtual void Operation() = 0;
    void setImplementor(Implementor *value)
    {
        this->implementor = value;
    }
};

class RefinedAbstraction:public Abstraction{


    // shouji interface
public:
    void Operation()
    {
        this->implementor->Operation();
    }
};

int main()
{
    Abstraction *ab = new RefinedAbstraction();

    ab->setImplementor(new ConcreteImplementorA());
    ab->Operation();

    ab->setImplementor(new ConcreteImplementorB());
    ab->Operation();
    return 0;
}

运行结果: 

ConcreteImplementorA
ConcreteImplementorB

二 手机和软件的实例

结构图

实际的编程使用的UML图是介样的。 

 

  代码实现是介样的:

#include <iostream>
#include <vector>
#include <mutex>
using namespace std;

class ruanjian
{
public:
    virtual void run() = 0;
};
class game:public ruanjian
{


    // ruanjian interface
public:
    void run()
    {
        cout << "play game" << endl;
    }
};
class daohang:public ruanjian
{


    // ruanjian interface
public:
    void run()
    {
        cout << "go to somewhere" << endl;
    }
};

class shouji{
public:
    ruanjian *rj = nullptr;
    virtual void run() = 0;
    void setRj(ruanjian *value);
};

void shouji::setRj(ruanjian *value)
{
    rj = value;
}

class xiaomi:public shouji{


    // shouji interface
public:
    void run();
};

void xiaomi::run()
{
    this->rj->run();
}
class huawei:public shouji{


    // shouji interface
public:
    void run();
};

void huawei::run()
{
    this->rj->run();
}
int main()
{
    shouji *hw = new huawei();

    hw->setRj(new game());
    hw->run();

    shouji *xm = new xiaomi();

    xm->setRj(new daohang());
    xm->run();
    return 0;
}

运行结果 

play game
go to somewhere

小结

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

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

相关文章

掌握MySQL分库分表(六)解决主键重复问题--Snowflake雪花算法

文章目录问题及需求常用ID解决方案数据库自增IDUUIDRedis发号器Snowflake雪花算法分布式 ID 生成算法Snowflake原理关于bit与byte雪花算法的位数Snowflake必须注意的地方全局唯⼀、不能重复保证各个系统时间一致Snowflake雪花算法实现雪花算法测试结果问题及需求 单库下⼀般使…

模块Model

定义 包含一系列数据&#xff0c;函数&#xff0c;类的文件&#xff0c;通常以.py结尾 作用 让相关的数据&#xff0c;函数&#xff0c;类有逻辑的组织 第一种调用方法直接通过import导入模块名 首先创建模块module01.py import timedef print_nowtime():"""…

sqlserver复制远程数据库到本地

文章目录前言一、前置知识在微软的SQL Server 2000 数据库有三种类型的文件&#xff1a;主要数据文件&#xff1a;&#xff08;扩展名.mdf是 primary data file 的缩写&#xff09;次要数据文件&#xff08;扩展名.ndf是Secondary data files的缩写&#xff09;事务日志 &#…

【数据结构】——树和二叉树的概念

目录 1.树概念及结构 1.1树的概念 1.2 树的相关性质 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树概念 2.2 特殊的二叉树 2.3 二叉树的性质 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构…

Retrofit+Hilt后端请求小项目2--依赖与准备工作

目录依赖处理settings.gradlebuild.gradle(project:app)build.gradle(module:app)准备工作接口安装 JSON 转 kotlin 插件获取 JSON依赖处理 settings.gradle 首先在此指定使用 hilt 依赖时的版本 pluginManagement {repositories {gradlePluginPortal()google()mavenCentral…

服务稳定性保障手段与规范

服务的稳定性&#xff0c;对于任何一个在线提供服务给用户的公司来说&#xff0c;都是非常重要的。任何一次线上事故&#xff0c;都可能会给公司带来显而易见的损失。因为相比于其他部门&#xff0c;负责基础技术、公共服务的同学&#xff0c;发生事故的时候很容易暴露在风口浪…

Kaldi语音识别技术(七) ----- 训练GMM

Kaldi语音识别技术(七) ----- GMM 文章目录Kaldi语音识别技术(七) ----- GMM训练GMMtrain_mono.sh 用于训练GMM训练GMM—生成文件训练GMM—final模型查看训练GMM—final.occs查看训练GMM—对齐信息查看训练GMM—fsts.*.gz查看训练GMM—tree决策树查看align_si.sh 用于对齐训练G…

Cookies与Session会话技术详解

引言:日常生活中&#xff0c;人和人之间沟通交流&#xff0c;涉及到一个词----会话&#xff0c;软件中一样存在会话&#xff0c;如&#xff1a;网购登录&#xff0c;访问公司OA系统也是不断的会话&#xff0c;软件中如何管理浏览器客户端和服务端之间会话过程中的会话数据呢&am…

oscp_靶场练习_Lame

oscp_靶场练习_Lame 1. nmap扫描&#xff1a; └─# nmap 10.10.10.3 Starting Nmap 7.92 ( https://nmap.org ) at 2023-02-20 23:21 EST Nmap scan report for 10.10.10.3 Host is…

switch的使用细节

1.switch的基本语法 switch(表达式){ case 常量1: 语句块1; break; case 常量2: 语句块2; break; … case 常量n: 语句块n; break; default: default语句块; break; } &#xff08;1&#xff09;switch关键字&#xff0c;表示switch分支 &#xff08;2&#xff09;表达式对应一…

web自动化测试中的几个定位方法

1. id定位 # id定位,属性 操作 返回 webELement 对象 ele1 driver.find_element_by_id("kw") print(ele1)2. 标签名定位 tag_name 不能唯一的找到特定的元素 ele2 driver.find_element_by_tag_name("input") # &#xff08;译&#xff1a;泰格.内幕…

数组-二分查找-搜索插入位置/在排序数组中查找元素的第一个和最后一个位置/x 的平方根/有效的完全平方数

二分查找 35搜索插入位置 https://leetcode.cn/problems/search-insert-position/submissions/ class Solution:def searchInsert(self, nums: List[int], target: int) -> int:l 0r len(nums)-1# // 整数除法 int /浮点数除法while(l<r):mid l (r - l)//2if nums…

Java基础43 异常(Exception)

异常&#xff08;Exception&#xff09;Exception1.1 异常的概念1.2 异常体系图&#xff08;☆&#xff09;1.3 异常处理分类1.3.1 运行时异常&#xff08;☆&#xff09;1.3.2 编译时异常&#xff08;☆&#xff09;1.4 异常处理&#xff08;☆&#xff09;1.4.1 try-catch异常…

关于联想Y7000P睡眠后无法唤醒问题修复

这个新的机器是WINDOWS11的&#xff0c;症状了自己睡眠后就醒不过来了&#xff0c;于是我找到了公众号&#xff0c;提示下载一个软件修复驱动&#xff0c;http://tools.lenovo.com.cn/tools/exeTools/download?tool_id233但是执行后还是发现有问题&#xff0c;而且比较诡异于是…

【C++】秋招实习面经汇总篇

C面经汇总 系列综述&#xff1a; 目的&#xff1a;本系列是个人整理为了秋招和实习面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡背诵量与深入程度。 来源&#xff1a;材料主要源于阿秀的笔记和《王道考研复习指导》进行的&#xff0c;每个知识点的修正和深入主要…

MySQL索引篇

文章目录说明&#xff1a;索引篇一、索引常见面试题按数据结构按物理存储分类按字段特性分类按字段个数分类索引缺点&#xff1a;什么时候适用索引&#xff1f;什么时候不需要创建索引&#xff1f;常见优化索引的方法&#xff1a;发生索引失效的情况&#xff1a;二、从数据页角…

C#把图片放到picturebox上的指定位置,PointToClient与PointToScreen解读

1、C#中如何把图片放到picturebox上的指定位置 构造一个跟picturebox1一样大小的Bitmap&#xff0c; 设置给picturebox1&#xff0c; 然后在上面画图 Bitmap image new Bitmap(picturebox1.Size.Width, picturebox1.Size.Height); Graphics device Graphics.FromImage(imag…

FPGA电源电流参数

一、FPGA里各个电源释义 VCCINT VCCINT是FPGA芯片的内核电压&#xff0c;是用来给FPGA内部的逻辑门和触发器上的电压。即芯片的晶体管开关是有核心电压提供。当内部逻辑工作时钟速率越高&#xff0c;使用逻辑资源越多&#xff0c;则核心电压供电电流会更大&#xff0c;可高达几…

【halcon】模板匹配和仿射变换总结

前言 模板匹配和仿射变换&#xff0c;经常一起使用&#xff0c;他们之前的位置变换一般有两种情况&#xff01; 情况一 模板是一个很正的图&#xff0c;利用模板的位置&#xff0c;将歪的图像摆正。 情况二 模板和图片正不正都无所谓&#xff0c;只需想模板的位置&#xff0…

内网穿透/组网/设备上云平台EasyNTS上云网关的安装操作指南

EasyNTS上云网关的主要作用是解决异地视频共享/组网/上云的需求&#xff0c;网页对域名进行添加映射时&#xff0c;添加成功后会生成一个外网访问地址&#xff0c;在浏览器中输入外网访问地址&#xff0c;即可查看内网应用。无需开放端口&#xff0c;EasyNTS上云网关平台会向Ea…