首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式系列| 桥接模式

设计模式系列| 桥接模式

作者头像
狼王编程
发布于 2021-06-01 08:13:39
发布于 2021-06-01 08:13:39
81110
代码可运行
举报
文章被收录于专栏:狼王编程之路狼王编程之路
运行总次数:0
代码可运行

大家好,我是狼王,一个爱打球的程序员

这是设计模式的第八篇,这篇让我们来认识一下桥接模式


1、概述

桥接模式是一种结构型设计模式, 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。

2、适用场景

1)如果你想要拆分或重组一个具有多重功能的庞杂类 , 可以使用桥接模式。2) 如果你希望在几个独立维度上扩展一个类, 可使用该模式。对象的属性有其他类去实现,不需要自己处理所有工作。3)如果你需要在运行时切换不同实现方法, 可使用桥接模式。桥接模式可替换抽象部分中的实现对象, 具体操作就和给成员变量赋新值一样简单。

3、实例

有以下场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
支付途径:微信,支付宝
支付方式:指纹,扫脸

3.1 不使用桥接模式

定义两个枚举

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付方式
 */
public enum PayMethodEnum {

    FACE(0, "扫脸"),
    FINGER(1, "指纹");


    PayMethodEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName(int code) {
        PayMethodEnum[] payWaysEnums = values();
        for (PayMethodEnum payMethodEnum : payWaysEnums) {
            if (payMethodEnum.code == code) {
                return payMethodEnum.name;
            }
        }
        return null;
    }

    public void setName(String name) {
        this.name = name;
    }

    private int code;

    private String name;

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付途径
 */
public enum PayWaysEnum {

    ZHIFUBAO(0, "支付宝"),
    WEIXIN(1, "微信");


    PayWaysEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    private int code;


    public void setName(String name) {
        this.name = name;
    }

    public String getName(int code) {
        PayWaysEnum[] payWaysEnums = values();
        for (PayWaysEnum payWaysEnum : payWaysEnums) {
            if (payWaysEnum.code == code) {
                return payWaysEnum.name;
            }
        }
        return null;
    }

    private String name;

}

定义支付业务流程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Pay {

    public void pay(int payMethod, int payWay) {
        if (PayMethodEnum.FACE.getCode() == payMethod) {
            System.out.println("当前支付方式是:" + PayMethodEnum.FACE.getName(payMethod));
        } else {
            System.out.println("当前支付方式是:" + PayMethodEnum.FINGER.getName(payMethod));
        }
        if (PayWaysEnum.ZHIFUBAO.getCode() == payWay) {
            System.out.println("当前支付途径是:" + PayWaysEnum.ZHIFUBAO.getName(payWay));
        } else {
            System.out.println("当前支付途径是:" + PayWaysEnum.WEIXIN.getName(payWay));
        }
    }
}

测试类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class TestDemo {

    @Test
    public void test() {
        Pay pay = new Pay();
        //支付宝扫脸支付
        pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.ZHIFUBAO.getCode());
        System.out.println("--------------------------------------");
        //微信扫脸支付
        pay.pay(PayMethodEnum.FACE.getCode(),PayWaysEnum.WEIXIN.getCode());
        System.out.println("--------------------------------------");
        //支付宝指纹支付
        pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.ZHIFUBAO.getCode());
        System.out.println("--------------------------------------");
        //微信指纹支付
        pay.pay(PayMethodEnum.FINGER.getCode(),PayWaysEnum.WEIXIN.getCode());
        System.out.println("--------------------------------------");
    }

}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
当前支付方式是:扫脸
当前支付途径是:支付宝
--------------------------------------
当前支付方式是:扫脸
当前支付途径是:微信
--------------------------------------
当前支付方式是:指纹
当前支付途径是:支付宝
--------------------------------------
当前支付方式是:指纹
当前支付途径是:微信
--------------------------------------

3.2 使用桥接模式

定义枚举:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付方式
 */
public enum PayMethodEnum {

    FACE(0, "扫脸"),
    FINGER(1, "指纹");


    PayMethodEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private int code;

    private String name;

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付途径
 */
public enum PayWaysEnum {

    ZHIFUBAO(0, "支付宝"),
    WEIXIN(1, "微信");


    PayWaysEnum(int code, String name) {
        this.code = code;
        this.name = name;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    private int code;


    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    private String name;

}

定义两个顶层抽象接口:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付方式接口
 */
public interface IPayMethod {

    void pay();
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付途径接口
 */
public interface IPayWay {

    void pay();
}

定义两种支付方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 指纹
 */
public class FingerPay implements IPayMethod {

    @Override
    public void pay() {
        System.out.println("当前支付方式是:" + PayMethodEnum.FINGER.name());
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 扫脸
 */
public class FacePay implements IPayMethod {

    @Override
    public void pay() {
        System.out.println("当前支付方式是:" + PayMethodEnum.FACE.name());
    }
}

定义两种支付途径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 微信
 */
public class WXPayWay implements IPayWay {

    private IPayMethod payMethod;

    public WXPayWay(IPayMethod payMethod) {
        this.payMethod = payMethod;
    }

    @Override
    public void pay() {
        System.out.println("当前支付方式是:" + PayWaysEnum.WEIXIN.getName());
        payMethod.pay();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 支付宝
 */
public class ZFBPayWay implements IPayWay {

    private IPayMethod payMethod;

    public ZFBPayWay(IPayMethod payMethod) {
        this.payMethod = payMethod;
    }

    @Override
    public void pay() {
        System.out.println("当前支付方式是:" + PayWaysEnum.ZHIFUBAO.getName());
        payMethod.pay();
    }
}

测试类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class TestDemo {

    @Test
    public void test() {
        FacePay facePay = new FacePay();
        FingerPay fingerPay = new FingerPay();
        ZFBPayWay zfbPayFace = new ZFBPayWay(facePay);
        WXPayWay wxPayWayFace = new WXPayWay(facePay);
        ZFBPayWay zfbPayFinger = new ZFBPayWay(fingerPay);
        WXPayWay wxPayWayFinger = new WXPayWay(fingerPay);
        //支付宝扫脸支付
        zfbPayFace.pay();
        System.out.println("--------------------------------------");
        //微信扫脸支付
        wxPayWayFace.pay();
        System.out.println("--------------------------------------");
        //支付宝指纹支付
        zfbPayFinger.pay();
        System.out.println("--------------------------------------");
        //微信指纹支付
        wxPayWayFinger.pay();
        System.out.println("--------------------------------------");
    }

}

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
当前支付方式是:支付宝
当前支付方式是:FACE
--------------------------------------
当前支付方式是:微信
当前支付方式是:FACE
--------------------------------------
当前支付方式是:支付宝
当前支付方式是:FINGER
--------------------------------------
当前支付方式是:微信
当前支付方式是:FINGER
--------------------------------------

4、分析

如上两种方式都实现了四种支付的过程,其中是以支付途径(支付宝、微信)为主,包含两种支付方式(扫脸、指纹)。

从代码量分析:

不使用:代码还是比较少的,但是其实主要业务逻辑要卸载Pay这个类中,通过if,else判断进行业务逻辑的判断。

使用:代码量大量提升,增加了很多个类,但是pay的业务逻辑只会在自己的类中执行,符合单一职责。

从可扩展层面,假如增加云闪付支付途径:

不使用:需要修改Pay类,增加云闪付的逻辑判断,不符合开闭原则。

使用:只需要增加一个云闪付支付途径即可,不需要修改其他业务逻辑,符合开闭原则。

代码耦合层面:

不使用:代码业务逻辑耦合在一起。

使用的:代码耦合性极低。

5、总结

优点:

1)客户端仅仅与高层抽象进行互动,不关系内部对象。2)符合单一原则。3)符合开闭原则。

缺点:

在业务对象很多,能抽象很多的业务逻辑而言,会大量的增加类的数量,导致代码的复杂性。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 狼王编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
user和item交叉,线上inference怎么做的?如何保证性能?
user和item交叉,线上inference怎么做的?如何保证性能?
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
【设计模式】桥接模式
桥接模式的主要作用是通过将抽象部分与实现部分分离,将多种可匹配的使用进行组合。其核心实现是在 A 类中含有 B 类接口,通过构造函数传递 B 类的实现,这个 B 类就是设计的桥。
Li_XiaoJin
2022/06/10
5840
重学 Java 设计模式:实战桥接模式「多支付渠道(微信)与多支付模式(刷脸、指纹)场景」
同类的业务、同样的功能,怎么就你能写出来那么多ifelse。很多时候一些刚刚从校园进入企业的萌新,或者一部分从小公司跳槽到大企业的程序员,初次承接业务需求的时候,往往编码还不成熟,经常一杆到底的写需求。初次实现确实很快,但是后期维护和扩展就十分痛苦。因为一段代码的可读性阅读他后期的维护成本也就越高。
小傅哥
2020/07/01
1.7K0
重学 Java 设计模式:实战桥接模式「多支付渠道(微信)与多支付模式(刷脸、指纹)场景」
重学Java设计模式:实战桥接模式
Java是一门非常流行的编程语言,它可以帮助开发者轻松地实现复杂的系统。设计模式则是Java开发中不可缺少的一部分,可以帮助开发者在开发复杂系统时,降低耦合度,提高可维护性,同时也可以提高代码的复用性和灵活性。本篇文章就围绕桥接模式展开,介绍如何在多支付渠道和多支付模式的场景中使用桥接模式。
啵啵肠
2023/11/15
2400
设计模式 - 结构型模式_桥接模式
结构型模式主要是解决如何将对象和类组装成较大的结构, 并同时保持结构的灵活和⾼效。
小小工匠
2023/02/23
4230
设计模式 - 结构型模式_桥接模式
设计模式(一) 支付策略模式
公司最近在做直播功能,底层原来有一套直播API,现在新增一套网宿直播API。 考虑以后的扩展性,需要将两套API进行统一管理。现在以网上的支付方式演示我对策略模式的理解。
用户1518699
2019/07/17
8870
使用策略模式重构电商折扣和支付场景
大家都知道,咕泡学院的架构师课程经常会有优惠活动,优惠策略有很多种可能,如领取优惠券抵扣、返现促销、拼团优惠等。下面用代码来模拟,首先创建一个促销策略的抽象PromotionStrategy。
Tom弹架构
2021/11/05
7460
10.桥接模式设计思想
本文介绍了桥接模式的设计思想和实现方法。桥接模式通过将抽象部分与实现部分分离,使它们可以独立变化,解决了多层继承带来的复杂性和耦合性问题。文章详细讲解了桥接模式的由来、定义、应用场景和实现步骤,并通过具体实例演示了如何在支付场景中使用桥接模式。此外,还讨论了桥接模式的优缺点及其适用环境,提供了丰富的代码示例和进一步学习的资源链接。
杨充
2024/11/06
2110
大厂面试必备之设计模式:漫画策略模式
官方定义不太好理解,我翻译一下,在策略模式中,会针对一个行为(比如支付),定义多个实现类,每个类都封装具体的实现算法,并且为了保证他们是同一行为,通常这些实现类,都会实现同一个接口。比如微信支付,支付宝支付,微信好友支付,QQ支付,缺省支付方式都是一个算法。
天才少年
2020/07/04
4820
大厂面试必备之设计模式:漫画策略模式
9条消除if...else的锦囊妙计,助你写出更优雅的代码
最近在做代码重构,发现了很多代码的烂味道。其他的不多说,今天主要说说那些又臭又长的if...else要如何重构。
苏三说技术
2021/01/05
1.8K0
设计模式(一) 支付策略模式
公司最近在做直播功能,底层原来有一套直播API,现在新增一套网宿直播API。 考虑以后的扩展性,需要将两套API进行统一管理。现在以网上的支付方式演示我对策略模式的理解。
用户1518699
2019/07/15
1.9K0
设计模式(一) 支付策略模式
设计模式----七大原则和UML类图
之前的支付案例,就是满足开闭原则的一个经典案例,当我们需要增加新的支付方式时,只需要增添一个接口的实现类即可,其余地方代码不需要做改动
大忽悠爱学习
2021/11/15
3480
别再用if-else了,用注解去代替他吧
经常在网上看到一些名为“别再if-else走天下了”,“教你干掉if-else”等之类的文章,大部分都会讲到用策略模式去代替if-else。策略模式实现的方式也大同小异。主要是定义统一行为(接口或抽象类),并实现不同策略下的处理逻辑(对应实现类)。客户端使用时自己选择相应的处理类,利用工厂或其他方式。
用户5397975
2020/06/16
9050
别再用if-else了,用注解去代替他吧
java开发中的枚举多种方式使用示例 java开发中的枚举多种方式使用示例
在 Java 开发中,枚举(Enum)远不止 “定义几个常量” 这么简单。它其实是一种特殊的类,能封装数据、实现接口,甚至处理复杂的业务逻辑。结合多年开发经验,整理了几种最常用的枚举使用场景,附完整示例代码。
小焱
2025/08/07
3270
实战|如何消除又臭又长的if...else判断更优雅的编程?
最近在做代码重构,发现了很多代码的烂味道。其他的不多说,今天主要说说那些又臭又长的if...else要如何重构。
苏三说技术
2020/10/15
1.2K0
实战|如何消除又臭又长的if...else判断更优雅的编程?
趣解设计模式之《把意大利炮给我拿来!》
回忆一下我们去饭店点餐,我们坐好,服务员给我们递过来菜单,我们点菜,点完菜我们就可以刷抖音或者玩王者荣耀了。那么过一会儿菜就上来了。谁做的菜?怎么做的菜?厨师的名字叫啥?他是什么星座的?是不是程序员转行了?我们一概不关心。
爪哇缪斯
2023/09/19
1420
趣解设计模式之《把意大利炮给我拿来!》
Spring事务扩展篇
之前我们已经深度剖析了Spring局部事务的实现,但是懂了实现还不够,我们需要从Spring的实现中学习到一些好用的设计思想,本篇文章就是来总结一下Spring事务设计的精华思想。
大忽悠爱学习
2022/07/12
4680
Spring事务扩展篇
Java基础不简单,讲一讲枚举
枚举是JDK1.5新增的一种数据类型,是一种特殊的类,常用于表示一组常量,比如一年四季,12个月份,星期一到星期天,服务返回的错误码,结算支付的方式等等。枚举是使用enum关键字来定义。
java技术爱好者
2021/03/15
3830
大数据必学Java基础(八十八):通过案例和概念体会反射的好处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象, 都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
Lansonli
2022/12/13
4090
大数据必学Java基础(八十八):通过案例和概念体会反射的好处
一个支付案例,学会策略模式!
在开发时,总会遇到支付的需求,但是支付的方式有很多,支付宝支付,微信支付,银行卡支付,每种支付方式的接口不一样,参数信息也不一样,一般情况下,会有很多if/else来进行判断,但是业务逻辑的逐渐增多,if/else显得那么的沉重,通过策略模式即可更优雅的来处理这种代码。
架构师修炼
2021/04/12
7380
优化你的if...else结构
最近在梳理支付逻辑,发现里面有很多需要优化的地方,本文主要聊一聊如何重构那些令人头秃的if...else。
啃饼思录
2023/03/18
4740
优化你的if...else结构
推荐阅读
相关推荐
【设计模式】桥接模式
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验