07_23 种设计模式之《桥接模式》

news2024/10/10 10:25:17

文章目录

    • 一、桥接模式基础知识
    • 二、桥接模式实战应用

一、桥接模式基础知识

桥接模式定义:将抽象部分与它的实现部分分离,使它们都可以
独立地变化。桥接模式的结构图如下:
Abstraction:抽象部分的接口。
RefinedAbstraction:扩展抽象部分的接口。
Implementor:定义实现部分的接口。
ConcreteImplementor:真正实现 Implementor 接口的对象(具体实现类)。

桥接模式应用场景:
一个类内部具备两种或多种变化维度时,使用桥接模式解耦这些变化的维度,使高层代码架构稳定
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时
当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。

二、桥接模式实战应用

手机支付方式:支付宝 APP、微信、HuaweiPay 等多种,
APP支持三种付款验证:密码、指纹、人脸。
桥接模式实现方式:IPayMode类是实现类,定义基本操作 security(),用于设置验证方式,其子类
提供实现,它位于桥接模式的抽象层。


#include <iostream>
using namespace std;


// 支付模式--实现化角色(实现类接口,Implementation(实现类接口))
class IPayMode {
public:
    virtual bool security(string Uid) = 0;
};

// 具体实现化角色:密码支付(具体实现类)
class PayCypher :public IPayMode {
public:
    bool security(string uId) override {
        cout << "密码支付,风控校验环境安全." << endl;
        return true;
    }
};

// 人脸支付 
class PayFaceMode :public IPayMode {
public:
    bool security(string uId) override {
        cout << "人脸支付,风控校验脸部识别." << endl;
        return true;
    }
};

// 指纹支付
class PayFingerPrintMode :public IPayMode {
public:
    bool security(string uId) override {
        cout << "指纹支付,风控校验指令信息安全." << endl;
        return true;
    }
};

// 抽象化类:支付(抽象化角色)
class Pay {
public:
    IPayMode *payMode;

    Pay(IPayMode* payMode)
    {
        this->payMode = payMode; // 抽象类定义一个IPayMode,跟IPayMode存在关联关系
    }

    virtual ~Pay() {
        delete payMode;
    }

    virtual string transfer(string uId, string tradeId, long long amount) = 0;

};

// 扩展抽象化角色:微信支付
class WxPay :public Pay {
public:
    WxPay(IPayMode* payMode) :Pay(payMode) {}
    // 扩展抽象类(实现抽象类中定义的成员函数)
    string transfer(string uId, string tradeId, long long amount) {
        cout << "微信支付开始,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;

        bool security = payMode->security(uId);
        if (!security)
        {
            cout << "微信支付失败,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;
            return "Fail000";
        }
        else
        {
            cout << "微信支付成功,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;
            return "Success001";
        }
    }
};


// 扩展抽象化角色:支付宝支付
class AliPay :public Pay {
public:
    AliPay(IPayMode* payMode) :Pay(payMode) {}
    // 扩展抽象类(实现抽象类中定义的成员函数)
    string transfer(string uId, string tradeId, long long amount) {
        cout << "支付宝支付开始,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;

        bool security = payMode->security(uId);
        if (!security)
        {
            cout << "支付宝支付失败,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;
            return "Fail000";
        }
        else
        {
            cout << "支付宝支付成功,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;
            return "Success001";
        }
    }
};


// 扩展抽象化角色:华为支付
class HuaweiPay :public Pay {
public:
    HuaweiPay(IPayMode* payMode) :Pay(payMode) {}
    // 扩展抽象类(实现抽象类中定义的成员函数)
    string transfer(string uId, string tradeId, long long amount) {
        cout << "华为支付开始,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;

        bool security = payMode->security(uId);
        if (!security)
        {
            cout << "华为支付失败,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;
            return "Fail000";
        }
        else
        {
            cout << "华为支付成功,用户ID:" << uId << "交易ID:" << tradeId << "交易金额:" << amount << endl;
            return "Success001";
        }
    }
};


int main()
{
    cout << "--------------------请选择付款方式--------------------" << endl;
    Pay* wxpay = new WxPay(new PayFaceMode());
    wxpay->transfer("weixin_666", "20221201", 290000);
    cout << endl << endl;
    
    cout << "--------------------请选择付款方式--------------------" << endl;
    Pay* huawei = new HuaweiPay(new PayCypher());
    huawei->transfer("Huawei_888", "20221208", 1000000);
    cout << endl << endl;

    cout << "--------------------请选择付款方式--------------------" << endl;
    Pay* alipay = new AliPay(new PayFingerPrintMode());
    alipay->transfer("Alipay_999", "20221209", 9000000);
    cout << endl << endl;

    return 0;
}

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

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

相关文章

SpringBoot 整合 阿里云 OSS图片上传

一、OOS 简介 ‌阿里云OSS&#xff08;Object Storage Service&#xff09;是一种基于云存储的产品&#xff0c;适用于存储和管理各种类型的文件&#xff0c;包括图片、视频、文档等。‌ 阿里云OSS具有高可靠性、高可用性和低成本等优点&#xff0c;因此被广泛应用于各种场景&…

能源监控大数据界面,洞察一切生产态势

能源监控大数据界面犹如一扇洞察一切生产态势的神奇之窗。在这个界面上&#xff0c;丰富的数据以直观的图表、动态的图形和醒目的数字呈现出来。 通过色彩鲜明的仪表盘&#xff0c;能清晰地了解能源的实时消耗情况&#xff0c;红色区域的警示提醒着可能存在的能源浪费或异常情…

【exp报错注入】

整数范围 最大整数 exp 函数介绍 报错盲注注入 payload分析 709C-ASCII 值就等于我们下面的 7091-1 &#xff0c;C就是我们要猜的值&#xff0c;当我们猜测的值和ASCII码相等时&#xff0c;那么exp就不会出现报错&#xff0c;因为1-1还是等于709&#xff1a; 练习 id1 an…

wordpress使用popup弹窗插件的对比

您在寻找最好的 WordPress 弹出插件吗&#xff1f;大多数网站利用某种形状或形式的弹出窗口来将访问者指向他们希望他们去的地方。例如&#xff0c;这可能用于结帐、电子邮件订阅或用于生成潜在客户。 表现 弹出插件会减慢您的网站速度。当插件使用 WordPress 跟踪弹出窗口的…

《网络安全自学教程》- Nmap使用及扫描原理分析

《网络安全自学教程》 Nmap&#xff08;Network Mapper&#xff09;是一款免费的开源网络扫描器&#xff0c;向目标主机发送特定的数据包&#xff0c;根据返回的流量特征&#xff0c;分析主机信息。主要功能有&#xff1a;「端口扫描」、「主机探测」、「服务识别」和「系统识别…

数学建模算法与应用 第3章 非线性规划及其求解方法

目录 3.1 非线性规划概述 3.2 约束优化问题 3.3 无约束优化问题的Matlab求解 3.4 牛顿法与梯度下降法 Matlab代码示例&#xff1a;梯度下降法求解简单非线性问题 3.5 非线性规划在机器学习中的应用 习题 3 总结 非线性规划&#xff08;Nonlinear Programming, NLP&…

Vue3入门学习

Vue3入门学习 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

【源码+文档+调试讲解】二手物品调剂系统NODEJS

摘 要 二手物品调剂系统是一种在线平台&#xff0c;旨在促进用户之间的二手物品交易。该系统提供了一个方便的界面&#xff0c;让用户能够发布、浏览和搜索二手物品信息。用户可以根据自己的需求和兴趣&#xff0c;筛选出合适的物品&#xff0c;并通过系统与卖家进行联系。系统…

MES 系统在制造业数字化转型中的关键角色_SunMES

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 在制造业数字化转型的宏大进程中&#xff0c;MES&#xff08;制造执行系统&#xff09;系统扮演着举足轻重的角色。 首先&#xff0c;MES 系统是数据采集与整合的…

QDateTime 使用详解

QDateTime 是 Qt 框架中用于处理日期和时间的类。本篇文章详细介绍、通过示例 快速了解QDateTime的各种操作&#xff0c;包括: 当前时间、获取日期和时间、获取日期、获取时间、获取时间戳、格式化输出、年、月、日、QTime时间、获取微妙、操作日期和时间、添加时间、减去时间、…

搭建 golang 项目的目录介绍及其用途对比表

文章目录 1.目录细则表2.目录使用说明及典型内容2.例 K8S 源码目录编排 1.目录细则表 常见 Go 项目目录的作用、典型内容、文件类型和使用场景~ 目录名作用/用途常见文件类型使用场景及详细说明典型内容举例cmd/存放可执行文件的入口点&#xff0c;通常为项目主程序入口或工具…

SAP_FI模块-公司间资产转移ABT1N操作

业务背景&#xff1a; 1、用户在OA走公司间资产的转移流程时&#xff0c;提示错误以下错误&#xff1b; 通过与OA开发的同事沟通发现&#xff0c;调用的接口是自开发的这个&#xff1a;ZFIF_AA_TRANSFER_POST&#xff0c;使用的是BDC录屏的方式&#xff0c;真正执行的事务码是A…

重学SpringBoot3-集成Redis(一)之基础功能

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Redis&#xff08;一&#xff09;之基础功能 1. 项目初始化2. 配置 Redis3. 配置 Redis 序列化4. 操作 Redis 工具类5. 编写 REST 控制器6. 测试 AP…

DAMA数据管理知识体系(第12章 元数据管理)

课本内容 12.1 引言 图12-1 语境关系图&#xff1a;元数据概念理解 元数据的信息范围很广&#xff0c;不仅包括技术和业务流程、数据规则和约束&#xff0c;还包括逻辑数据结构与物理数据结构等。它描述了数据本身&#xff08;如数据库、数据元素、数据模型&#xff09;&#x…

MokeJs使用实例

文章目录 MokeJs使用实例介绍使用安装配置文件导入配置到main.js使用 axios 发送网络请求测试&#xff08;如果不会axios&#xff0c;具体可以见上篇文章axios&#xff09;启动示例 MokeJs使用实例 介绍 使用 安装 npm install mockjs --save-dev # 或者 yarn add mockj…

python画图|两个Y轴共享X轴

【1】引言 在前述学习中&#xff0c;对使用matplotlib模块输出图形已经非常熟练&#xff0c;但常见的画图方式并未穷尽&#xff0c;如两个Y轴共享X轴就没有探索过。 对此&#xff0c;我进行了一些学习&#xff0c;获得一些心得&#xff0c;在此和大家共享。 【2】官网教程 …

点评项目-4-隐藏敏感信息、使用 redis 优化登录业务

一、隐藏敏感信息 之前我们对 /user/me 路径&#xff0c;直接返回了登录的所有用户信息&#xff0c;其中的 passward 等敏感信息也会被返回到前端&#xff0c;这是很危险的&#xff0c;故我们需要选择性的返回用户信息&#xff0c;隐藏敏感用户信息 我们可以创建一个 UserDTO…

ECCV`24 | 新加坡国立华为提出Vista3D: 实现快速且多视角一致的3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2409.12193 gitbub链接&#xff1a;https://github.com/florinshen/Vista3D 亮点直击 提出了Vista3D&#xff0c;一个用于揭示单张图像3D darkside 的框架&#xff0c;能够高效地利用2D先验生成多样的3D物体。开发了一种从高斯投影到…

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

目录 1 C 程序内存区域划分 1.1 代码区 (Code Section) 1.2 全局/静态区 (Global/Static Section) 1.3 栈区 (Stack Section) 1.4 堆区 (Heap Section) 1.5 动态内存分配 2 void 指针&#xff08;无类型指针&#xff09; 2.1 void 指针介绍 2.2 void 指针的作用 2.3 …

Web自动化Demo-Go+Selenium

1.新建工程 使用GoLand新建工程如下&#xff1a; 打开终端输入如下命令安装Selenium go get -u github.com/tebeka/selenium 2.编写代码 package mainimport ("fmt""github.com/tebeka/selenium""log""time" )const (chromeDriver…