前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式系列| 桥接模式

设计模式系列| 桥接模式

作者头像
狼王编程
发布2021-06-01 16:13:39
7120
发布2021-06-01 16:13:39
举报
文章被收录于专栏:狼王编程之路狼王编程之路

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

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


1、概述

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

2、适用场景

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

3、实例

有以下场景:

代码语言:javascript
复制
支付途径:微信,支付宝
支付方式:指纹,扫脸

3.1 不使用桥接模式

定义两个枚举

代码语言:javascript
复制
/**
 * 支付方式
 */
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
复制
/**
 * 支付途径
 */
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
复制
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
复制
@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
复制
当前支付方式是:扫脸
当前支付途径是:支付宝
--------------------------------------
当前支付方式是:扫脸
当前支付途径是:微信
--------------------------------------
当前支付方式是:指纹
当前支付途径是:支付宝
--------------------------------------
当前支付方式是:指纹
当前支付途径是:微信
--------------------------------------

3.2 使用桥接模式

定义枚举:

代码语言:javascript
复制
/**
 * 支付方式
 */
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
复制
/**
 * 支付途径
 */
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
复制
/**
 * 支付方式接口
 */
public interface IPayMethod {

    void pay();
}
代码语言:javascript
复制
/**
 * 支付途径接口
 */
public interface IPayWay {

    void pay();
}

定义两种支付方式:

代码语言:javascript
复制
/**
 * 指纹
 */
public class FingerPay implements IPayMethod {

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

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

定义两种支付途径:

代码语言:javascript
复制
/**
 * 微信
 */
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
复制
/**
 * 支付宝
 */
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
复制
@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
复制
当前支付方式是:支付宝
当前支付方式是:FACE
--------------------------------------
当前支付方式是:微信
当前支付方式是:FACE
--------------------------------------
当前支付方式是:支付宝
当前支付方式是:FINGER
--------------------------------------
当前支付方式是:微信
当前支付方式是:FINGER
--------------------------------------

4、分析

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

从代码量分析:

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

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

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

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

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

代码耦合层面:

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

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

5、总结

优点:

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

缺点:

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述
  • 2、适用场景
  • 3、实例
    • 有以下场景:
      • 3.1 不使用桥接模式
        • 定义两个枚举
        • 定义支付业务流程:
        • 测试类:
        • 结果:
      • 3.2 使用桥接模式
        • 定义枚举:
        • 定义两个顶层抽象接口:
        • 定义两种支付方式:
        • 定义两种支付途径:
        • 测试类:
        • 结果:
        • 从代码量分析:
        • 从可扩展层面,假如增加云闪付支付途径:
        • 代码耦合层面:
        • 优点:
        • 缺点:
    • 4、分析
    • 5、总结
    相关产品与服务
    人脸支付
    腾讯云人脸支付(Face Recognition Payment,FRP)基于腾讯优图先进的人脸识别技术,结合3D 结构光摄像头和整机设备,为您提供高可用高安全的刷脸支付模组和刷脸支付整机。您可以集成腾讯云人脸支付模组组装刷脸支付整机,或直接购买腾讯云刷脸支付整机。人脸支付的使用,可有效提升用户日常购物消费体验,提高商家的交易效率,带动零售业发展。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档