设计模式-结构性模式-桥接模式

news2024/9/22 3:47:31

1.桥接模式定义

        桥接模式就是将抽象部分与他的实现部分分离,使他们都可以独立的变化;

        桥接模式用一种巧妙地方式处理多层继承存在的问题,用抽象关联来取代传统的多层继承,将类之间的静态继承关系转变为动态的组合关系,使得系统更加灵活,并易于扩展,有效地控制了系统中类的个数;

1.1 桥接模式的优缺点

优点

  • 分离抽象接口及其实现部分,桥接模式使用对象间的关联关系解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的纬度来变化;
  • 在很多情况下,桥接模式可以取代多层继承方案,多层继承方案违背了单一职责原则,复用性差,类的个数多;
  • 桥接模式提高了系统的可扩展性,在不同变化维度中任意扩展一个纬度不需要修改原有系统,符合开闭原则;

缺点

  • 桥接模式的使用会增加系统的理解和设计难度,由于关联关系建立在抽象层,要求开发者一开始就要对抽象层进行设计和编程;
  • 桥接模式要求正确识别出系统中的不同变化的维度,需要一定的经验,因此具有一定的局限性;

1.2 桥接模式使用场景

  •  需要提供平台独立性的应用程序时,如不同数据库的JDBC驱动程序;
  • 需要在某种统一协议下增加更多组件时,如支付场景,行为统一为收款、付款等具体实现为微信、支付宝等;
  • 基于消息驱动的场景,行为统一为发送、接收、处理等,具体的实现为短信、邮箱等;
  • 拆分复杂的类对象,当一个类包含大量对象和方法;
  • 希望从多个独立维度扩展时,如系统功能性和非功能性角度,业务和技术角度;

2.桥接模式的原理

  • 抽象化角色(Abstraction):主要负责定义出该角色的行为,并包含一个对现实化对象的引用;
  • 扩展抽象化角色(RefinedAbstraction):是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法;
  • 实现化角色(Implementor):定义实现化角色的接口,包含角色必须的行为和属性,并供扩展抽象化角色调用;
  • 具体实现化角色(Concrete Implementor):给出实现化角色接口的具体实现;

        桥接模式我理解的就是由一条主线转为树状结构,将类的不同变化维度分离开;

3.桥接模式实现

【实例】

        模拟支付场景,不同的支付工具(支付宝、微信)有着不同的支付方式(密码、指纹)

​​​​​​​

【代码】

        支付模式接口(实现化角色)

public interface IPayMode {
    //安全校验功能: 对各种支付模式进行风控校验
    boolean security(String uId);
}

        具体支付模式(具体实现化角色)

//指纹支付及风控校验
public class PayFingerprintMode implements IPayMode {

    @Override
    public boolean security(String uId) {
        System.out.println("指纹支付,风控校验-指纹信息");
        return true;
    }
}

//密码支付及风控校验
public class PayPasswordMode implements IPayMode {

    @Override
    public boolean security(String uId) {
        System.out.println("密码支付,风控校验-环境安全");
        return false;
    }
}

        支付抽象类(抽象化角色)

public abstract class Pay {

    //桥接对象
    protected IPayMode payMode;

    public Pay(IPayMode payMode) {
        this.payMode = payMode;
    }

    //划账功能
    public abstract String transfer(String uId, String tradeId, BigDecimal amount);

}

        支付工具实现(扩展抽象化角色)

public class WxPay extends Pay {


    public WxPay(IPayMode payMode) {
        super(payMode);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {

        System.out.println("微信渠道支付划账开始......");

        boolean security = payMode.security(uId);
        System.out.println("微信渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);

        if(!security){
            System.out.println("微信渠道支付划账失败!");
            return "500";
        }

        System.out.println("微信渠道划账成功! 金额: "+ amount);
        return "200";
    }
}

public class AliPay extends Pay {

    public AliPay(IPayMode payMode) {
        super(payMode);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {

        System.out.println("支付宝渠道支付划账开始......");

        boolean security = payMode.security(uId);
        System.out.println("支付宝渠道支付风险校验: " + uId + " , " + tradeId +" , " + security);

        if(!security){
            System.out.println("支付宝渠道支付划账失败!");
            return "500";
        }

        System.out.println("支付宝渠道划账成功! 金额: "+ amount);
        return "200";
    }
}

        客户端

Pay wxpay = new WxPay(new PayPasswordMode());
wxpay.transfer("wx_00100100","10001900",new BigDecimal(100));

Pay aliPay = new AliPay(new PayFingerprintMode());
aliPay.transfer("jlu1234567","567689999999",new BigDecimal(200));

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

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

相关文章

26个希腊字母写法和读音

瞧,在许多时候都会用到这些希腊字母,但不认识更不知道怎么读,so 记录一下便于查阅 26个希腊字母写法和读音 大写小写中文名英文注音意义Aα阿尔法Alpha角度;系数Bβ贝塔Beta磁通系数;角度;系数「γ伽玛Gamma电导系数(小写)Δδ德尔塔Delta变…

ES之二:centos7安装kibana和IK分词器

目录 一、Kibana介绍二、Kibana安装1、注意elasticsearch 和 kibana使用同一个版本2、更改配置3、kibana使用 三、Kibana安装1. 解压ik分词器2. 重新启动ES启动报错: 一、Kibana介绍 Kibana是一个针对Elasticsearch的开源分析及可视化平台,使用Kibana可…

客户端可以访问ntp时钟源,时间却一直不同步的问题

ntp时钟源通常是通过开放123 的udp端口对外提供ntp服务的,udp端口的访问可以通过nc -uvz xx.xx.xx.xx 123 端口进行验证,验证发现ntp时钟服务的123端口是开放的,也没有防火墙拦截123端口,但为什么客户端不同步ntp时钟源呢&#xf…

鸿蒙内核源码分析(异常接管篇) | 社会很单纯,复杂的是人

为何要有异常接管? 拿小孩成长打比方,大人总希望孩子能健康成长,但在成长过程中总会遇到各种各样的问题,树欲静而风不止,成长路上有危险,有时是自己的问题有时是外在环境问题.就像抖音最近的流行口水歌一样&#xff…

dp的练习总结(9)

P8766 异或三角 1.由题干给出的条件可知: (1)1≤a,b,c≤n,可得上限和枚举的范围 (2)a⊕b⊕c0,只有当前位相同的二进制数字异或才是 0,所以由此可知,当前位 a,b,c 都选 0,或 a,b,c 中任意两个数选择 1。同时…

Linux jobs命令:查看和管理后台任务

目录 一、jobs命令简介二、jobs命令适用的Linux版本三、jobs命令的基本语法四、jobs命令的常用选项或参数五、jobs命令实例5.1 显示当前shell中的后台作业将命令放到后台查看后台作业状态将后台作业带到前台 5.2 显示后台作业的进程号5.3 显示已停止的后台作业5.4 显示上次shel…

it程序员常用的技术社区网站有哪些

it程序员常用的技术社区网站有哪些??作为程序员,选择好合适的开发社区对提高自己的编程能力会有很大的帮助,技术人员经常会在各种技术交流社区游逛。优秀的实时开发社区确实能帮你积累不少开发经验技术教程 _ 网址大全 _ 博科趣 - 第1页技术教程网站,技…

cuda性能分析工具: nsight systems

安装 1. 安装nsys, nsys可以用命令行生成性能分析报告,参考: nsys profile 2. 安装Nsight Systems可视化工具NVIDIA Nsight Systems | NVIDIA 开发者 使用方法 1. 找一个可执行的cuda程序,编译成可执行文件,比如m…

14-17岁未成年如何办理能一直用的手机卡?

14-17岁未成年如何办理能一直用的手机卡? 有些姐妹要去外面上学,都想要一张属于自己的手机卡。 但是因为反诈的原因,对于手机卡的申领特别严格。 很多不满18岁的人能申领的卡,都是物联卡或者纯流量卡,只能上网&#x…

pytorch深度学习基础 6(简单的参数估计学习2)

上一节我们建立了一个简单的模型进行分析散点图,利用均方差来实现损失函数的计算,但是并没有计算出具体的参数值,这次我们来计算损失函数的损失值以及不断减小损失值,计算出最优的参数,代码原理非常简单大家可以自行理…

TOMCAT-企业级WEB应用服务器

一 WEB技术 1.1 HTTP协议和B/S 结构 HTTP(HyperText Transfer Protocol)协议即超文本传输协议,是用于在万维网(WWW)上传输超文本内容的基础协议。 一、HTTP 协议的特点 1、简单快速 客户向服务器请求服务时&#…

八股(3)——计网

八股(3)——计网 3. 计算机基础3.1 计算机网络OSI 七层模型是什么?每一层的作用是什么?TCP/IP 四层模型是什么?每一层的作用是什么?1. 应用层(Application layer)2. 传输层&#xff…

【iOS安全】iPhone8 iOS14.4.2 越狱教程

环境配置 iPhone 8: 固件版本 iOS 14.4.2 (18D70) 产品类型 iPhone10,1 (A1906) 销售型号 MQ862J/A MacBook Pro: macOS 10.15.7 装有CheckRa1n beta 0.12.4 概述 尝试了几个版本的unc0ver和Taurine,发现都不好使 unc0ver显示unsupported…

如何实现一棵AVL树

目录 1.什么是AVL树? 2.AVL树的实现 2.1AVL树结点的定义 2.2AVL树的插入 2.2.1插入的步骤 2.2.2插入情况分析 2.2.3旋转操作的分析 2.3AVL树的查找 3.AVL树的验证 4.AVL树的性能分析 1.什么是AVL树? AVL树其实就是一棵加了限制条件的二叉搜索树…

day38.动态规划+MySql数据库复习

844.比较含退格的字符串 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空 思路:定义两个栈,将字符…

集合及数据结构第九节————树和二叉树

系列文章目录 集合及数据结构第九节————树和二叉树 树和二叉树 树型结构的概念树的概念树的表示形式(了解)树的应用二叉树的概念两种特殊的二叉树二叉树的性质二叉树的性质练习二叉树的存储二叉树的遍历二叉树的基本操作二叉树相关练习题 文章目录…

flutter 中 ssl 双向证书校验

SSL 证书: 在处理 https 请求的时候,通常可以使用 中间人攻击的方式 获取 https 请求以及响应参数。应为通常我们是 SSL 单向认证,服务器并没有验证我们的客户端的证书。为了防止这种中间人攻击的情况。我么可以通过 ssl 双向认证的方式。即…

Leetcode JAVA刷刷站(91)解码方法

一、题目概述 二、思路方向 这个问题是一个典型的动态规划问题,其中我们可以使用一个数组来存储到达每个位置时的解码方法的总数。 我们定义一个数组 dp,其中 dp[i] 表示字符串 s 的前 i 个字符(从索引 0 到 i-1)的解码方法总数。…

企业数字化转型管控平台探索 ---基于流程的企业经络管理框架DEM

篇幅有限,获取完整内容、更多感兴趣的内容 见下图

OpenCV几何图像变换(8)调整图像大小的函数resize()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 resize 函数调整图像 src 的大小,使其缩小或放大至指定的大小。需要注意的是,初始的 dst 类型或大小不被考虑。相反&…