Java设计模式 _结构型模式_桥接模式

一、桥接模式

1、桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦,使得二者可以独立变化。

2、实现思路
使用桥接模式,一定要找到这个类中两个变化的维度:如支付功能中(平台类型,支付方式)或带颜色形状(形状,涂色)。
(1)、定义次维度规划抽象和实例方式(支付方式为抽象(接口),密码支付,扫脸支付,指纹支付为三种实例(接口实现类))。
(2)、次维度接口定义规范方法,每一种实现类遵循规范进行各自业务的实现。
(3)、定义主维度抽象类和实现类(支付渠道(抽象类),微信,支付宝(抽象类的实现类))
(4)、在主维度抽象类中,定义次维度的抽象属性,通过构造方法实例化该属性,定义统一的抽象方法(支付方法);
(5)、在主维度实现类中,通过自身方法和次维度属性的实现方法封装各自具体的业务方法。

二、代码示例

1、不使用桥接,直接判断

  // 定义和实现支付方法
 public static String doPay(String payUser,String receiveUser,double money, String payType,String securityMode){
        StringBuilder builder = new StringBuilder("");
        builder.append(payUser);
        if ("wechat".equals(payType)){
            builder.append("使用微信-");
            if ("password".equals(securityMode)){
                builder.append("密码支付");
            } else if("face".equals(securityMode)){
                builder.append("扫脸支付");
            }else if("fingerprint".equals(securityMode)){
                builder.append("指纹支付");
            }
            builder.append(money).append("元");
        }
        if ("alipay".equals(payType)){
            builder.append("使用支付宝-");
            if ("password".equals(securityMode)){
                builder.append("密码支付");
            } else if("face".equals(securityMode)){
                builder.append("扫脸支付");
            }else if("fingerprint".equals(securityMode)){
                builder.append("指纹支付");
            }
            builder.append(money).append("元");
        }
        builder.append("给").append(receiveUser);
        return builder.toString();
    }
    // 测试
    public static void main(String[] args) {
        System.out.println("直接方式");
        String directResult = doPay("张三", "李四", 30, "wechat", "password");
        System.out.println(directResult);
        directResult = doPay("张三", "王五", 10.6, "alipay", "fingerprint");
        System.out.println(directResult);
    }

运行结果:
在这里插入图片描述
说明:上面的示例中,虽然运行得到了正确的结果。但是从代码上看,所有的代码都写到一起,不利于代码阅读;且如果扩展支付方式或者支付平台,必然会影响彼此(如:扩展支付类型扫码支付,支付平台的微信和支付宝实现中都需要改造代码;再如:扩展支付平台中行支付,支付方式每一种都需要在新平台的方法中重写一遍),可以看出两个维度是强耦合关系,不符合设计模式的开闭原则。

2、桥接模式示例

// 支付类型接口--次维度抽象规范接口
public interface PayMode {
    String securityPay();
}
// 密码支付--次维度规范实现类1
public class PasswordMode implements PayMode {
    @Override
    public String securityPay() {
        return "密码支付";
    }
}
// 扫脸支付--次维度规范实现类2
public class FaceMode implements PayMode {
    @Override
    public String securityPay() {
        return "扫脸支付";
    }
}
// 指纹支付--次维度规范实现类3
public class FingerprintMode implements PayMode {
    @Override
    public String securityPay() {
        return "指纹支付";
    }
}

// 定义支付平台的抽象--主维度抽象方法
import lombok.Data;
@Data
public abstract class Pay {
    protected String payUser;
    protected String receiveUser;
    protected double money;
    protected PayMode payMode;   // 次维度的抽象属性

    public abstract String doPay();   // 支付方法
}
// 微信--主维度实现类1
public class WeChatPay extends Pay {
    public WeChatPay(Builder builder){
        this.payUser= builder.payUser;
        this.receiveUser= builder.receiveUser;
        this.money= builder.money;
        this.payMode= builder.payMode;
    }

    @Override
    public String doPay() {   // 实现主维度方法
        return payUser+"使用微信-"+payMode.securityPay()+money+"元给"+receiveUser;
    }

    public static class Builder{     // 建造者模式
        private String payUser;
        private String receiveUser;
        private double money;
        private PayMode payMode;
        public Builder setPayUser(String payUser) {
            this.payUser = payUser;
            return this;
        }
        public Builder setReceiveUser(String receiveUser) {
            this.receiveUser = receiveUser;
            return this;
        }
        public Builder setMoney(double money) {
            this.money = money;
            return this;
        }
        public Builder setPayMode(PayMode payMode) {
            this.payMode = payMode;
            return this;
        }
        public WeChatPay build() {
            return new WeChatPay(this);
        }
    }
}
// 支付宝--主维度实现类2
public class AliPayPay extends Pay {
    public AliPayPay(Builder builder){
        this.payUser= builder.payUser;
        this.receiveUser= builder.receiveUser;
        this.money= builder.money;
        this.payMode= builder.payMode;
    }
    @Override
    public String doPay() {  // 实现主维度方法
        return payUser+"使用支付宝-"+payMode.securityPay()+money+"元给"+receiveUser;
    }

    public static class Builder{    // 建造者模式
        private String payUser;
        private String receiveUser;
        private double money;
        private PayMode payMode;
        public Builder setPayUser(String payUser) {
            this.payUser = payUser;
            return this;
        }
        public Builder setReceiveUser(String receiveUser) {
            this.receiveUser = receiveUser;
            return this;
        }
        public Builder setMoney(double money) {
            this.money = money;
            return this;
        }
        public Builder setPayMode(PayMode payMode) {
            this.payMode = payMode;
            return this;
        }
        public AliPayPay build() {
            return new AliPayPay(this);
        }
    }
}
// 测试
 public static void main(String[] args) {
        System.out.println("桥接模式:");
        Pay wechatPay = new WeChatPay.Builder()
                .setPayUser("张三")
                .setReceiveUser("李四")
                .setMoney(20.9)
                .setPayMode(new PasswordMode())
                .build();
        System.out.println(wechatPay.doPay());
        Pay aliPay = new AliPayPay.Builder()
                .setPayUser("张三")
                .setReceiveUser("王五")
                .setMoney(8.9)
                .setPayMode(new FingerprintMode())
                .build();
        System.out.println(aliPay.doPay());
    }

运行结果:
在这里插入图片描述
说明:使用桥接模式,运行结果也满足需求。

3、桥接模式相对于直接调用的好处
1、解耦:使用桥接模式,如果扩展支付类型,仅通过新的类实现PayMode即可,不需要主维度代码修改;如果扩展支付平台,仅通过新的类实现Pay抽象类即可,不需要次维度代码修改;同时相对直接使用,更加准寻开闭原则。
2、代码逻辑更清晰,方便阅读。
3、更好的扩展方式。

但是桥接模式会增家类的定义和实现,一定层度上对框架的复杂度会有提升,所以实际场景还是根据自身情况决定比较好。

学海无涯苦作舟!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 前台浏览管理界面图,通过内容列表可以获取网…

Git--多人协作

目录 一、多人协作一二、多人协作二三、 远程分⽀删除后,本地git branch -a依然能看到的解决办法 一、多人协作一 ⽬前,我们所完成的⼯作如下: 1.基本完成Git的所有本地库的相关操作,git基本操作,分⽀理解,…

适用于芯片行业的开发及管理工具:版本控制、持续集成、代码分析及项目管理工具介绍

3月28日-29日,2024国际集成电路展览会暨研讨会(IIC Shanghai)在上海成功举行。此次盛会汇聚了集成电路产业的众多领军企业,共同探寻和把握集成电路产业的发展脉络。 龙智携芯片研发及管理解决方案亮相展会,展示如何通…

遥感雷达波段的原理及应用

雷达波段是不同波长的组。每一种都有其独特的穿透地球表面的能力。它们还可以揭示环境的不同方面。 雷达频段在电磁频谱内具有特定的频率范围。这些波段由 L-、S-、C- 和 X-波段等字母表示。稍后会详细介绍这一点。 什么是合成孔径雷达? 合成孔径雷达 (SAR) 是一…

云原生Kubernetes: K8S 1.29版本 部署GitLab

目录 一、实验 1.环境 2.搭建NFS 3.K8S 1.29版本 部署Redis 4.K8S 1.29版本 部署Postgresql 5.K8S 1.29版本 部署GitLab 6.K8S 部署istio微服务 7.K8S 部署ingress应用路由 二、问题 1.K8S部署gitlab报错 2.gitlab创建失败 3.生成网关资源报错 4.安装istio 报错 …

PotatoPie 4.0 实验教程(30) —— FPGA实现摄像头图像中值滤波

中值滤波是什么? 图像的中值滤波是一种非线性图像滤波方法,它用于去除图像中的椒盐噪声或其他类型的噪声。中值滤波的原理是用每个像素周围的邻域中的中值来替代该像素的值。与均值滤波不同,中值滤波不会受到极端值的影响,因此在处…

FebHost:摩洛哥.ma域名注册介绍,规则有哪些?

摩洛哥国家域名介绍 摩洛哥是位于非洲西北部的一个国家,北部和西部面向地中海和大西洋,东部和南部则与阿尔及利亚、西撒哈拉和毛里塔尼亚接壤。摩洛哥的首都是拉巴特,但最大城市是卡萨布兰卡。摩洛哥的官方语言是阿拉伯语和柏柏尔语&#xf…

BTCOIN发布WEB3.0论坛:生态与金融的双重叙事热点驱动自由创新意识

在数字时代,信息的自由流动和透明度是推动经济发展和社会进步的关键。尤其在加密货币和区块链领域,这一点尤为重要。BTCOIN的最新创举——一个基于WEB3.0理念的信息论坛,不仅标志着信息传递自由化的新篇章,也为数字货币市场的信息…

聊聊.NET Core处理全局异常有那些方法

简述 处理全局异常的方法有IExceptionFilter(异常处理),使用中间件异常处理,使用框架自带异常中间件等。考点 考察对异常处理方式的熟悉程度和广度,以及对中间件、过滤器熟练程度。 下面分别具体介绍三种处理异常的…

让华为设备跟上自动化的步伐,学会Python配置NETCONF,运维不再难!

在当今数字化时代,网络设备的自动化管理已经成为了不可或缺的趋势。对于华为设备的运维人员来说,学会利用Python配置NETCONF已经成为提高工作效率、降低运维成本的必备技能。本文将介绍如何利用Python和NETCONF来实现华为设备的自动化配置,让…

浅谈大数据时代下的电商风控||电商数据API接口

抢抢抢!最后1天,双十一直播活动来啦!抢直播专属优惠…… 视频号 随着大数据时代的兴起,互联网电商风控已经从无风控、人工抽取规则为主的简易规则模型发展到当前基于大数据的风控。与金融风控不同,互联网电商风控呈现出…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-3

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

红米K40手机刷机详解

了解什么是卡刷、什么是线刷 卡刷,就是把系统包放到你手机的SD卡,这一步,不用手机解BL锁,不用root,直接小米助手下载就可以刷。线刷就是用数据线连接电脑,通过XiaoMiFlash直接刷到手机,这一步权…

K8S深度解析:从入门到精通的全方位指南

目录 一、Kubernetes简介 二、Kubernetes的核心作用 三、Kubernetes架构图例 四、Kubernetes核心概念 Harbor仓库概述: Master----管理组件: API Server(集群之心): Scheduler(调度大师&…

27.统一网关Gateway-路由断言工厂

在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取并处理,转变为路由判断的条件。 例如:Path /user/** 是按照路劲匹配,这个规则是由 org.springframework.cloud.gateway.handler.predicate.PathRouteP…

磨煤机液压油站比例放大器

液压系统为磨辊提供随负荷变化而变化的碾压力,其大小由比例溢流阀根据负荷变化的指令信号来控制液压系统的压力来实现。指令信号一般情况下是由给煤机取出的。高压油泵站安装在靠近磨煤机的基础上,加载油缸和蓄能器安装在磨煤机上,三个带蓄能…

Vue入门到关门之计算属性与监听属性

一、计算属性 1、什么是计算属性 计算属性是基于其它属性计算得出的属性,就像Python中的property,可以把方法/函数伪装成属性,在模板中可以像普通属性一样使用,但它们是基于响应式依赖进行缓存的。这意味着只有在依赖的响应式数…

【进阶六】Python实现SDVRPTW(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

基于python语言,采用经典禁忌搜索(TS)模拟退火(SA)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时…

手机验证码认证轻松搞定,MemFire Cloud 助力应用开发

在当今移动互联网时代,手机验证码认证已成为众多应用必不可少的身份验证方式。然而,对于开发者来说,手机验证码认证的后端工作往往是一项繁琐且耗时的任务。MemFire Cloud提供了一套即用型解决方案,开发者可以轻松解决手机验证码认…

枚举(enum)/共用体(union)/结构体(struct)---详解

前言 C语言包含内置类型和自定义类型。 其实C语言中有内置类型,包含:char,short,int,long,long long,float,double,long double ,这些是C语言本身支持的现成的类型。 但仅仅只有内置类型是远远不够的,在描述一个复杂对象是无法使用内置类型来…
最新文章