IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 桥接模式介绍与使用 -> 正文阅读

[Java知识库]桥接模式介绍与使用

目录

一、桥接模式的概念

二、代码示例


一、桥接模式的概念

桥接模式的主要作用是通过将抽象部分与实现部分分离,将多种可以相互匹配的使用进行组合,

其核心实现是在A类中含有B类接口通过构造函数传递B类的实现,这个B类就是设计的桥。

桥接模式将继承的关系转化为关联的关系,这样做的优点就是降低了类与类之间的耦合度,减少系统中类的数量,也减少了代码量。

以上的概念听起来比较的晦涩难懂,但是呢其本质也不复杂,重点就是红色字体的部分。

桥接模式主要有以下几个角色:

1.抽象类:某个业务抽取的公共抽象方法;

2.扩充抽象类:继承抽象类的方法扩展;

3.实现类接口:角色抽象类中包含的接口;

4.实现类:接口的具体实现;

二、代码示例

首先我们来看下图所描述的业务场景:

有两种支付方式:支付宝和微信支付,我们需要通过支付宝或微信进行支付操作,但是在支付的时候,又有3种支付模式去进行安全校验,只有校验通过了才能进行支付转账等操作;

如果只是简单的使用面向过程开发的思路,通过if-else的形式去实现,简单而又快速,但是这样编写的代码后期可维护性和扩展性将变的很差,为什么这么说呢,比如密码支付校验逻辑变动,支付和微信里对于的代码我们都要去修改一遍才行。

那么,如果我们通过桥接模式去实现的话会是什么样的一种情况呢?

看看下图,然后通过代码来领会一下:

?代码实现如下:

1.抽象类

package com.demo.spring.design.bridging_model;


import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @Description: 支付渠道抽象类:比如支付宝支付、微信支付;
 * @Author: yangshilei
 */
@Slf4j
public abstract class Pay {

    protected IPayModel iPayModel;

    public Pay(IPayModel iPayModel) {
        this.iPayModel = iPayModel;
    }

    /**
     * 支付渠道的划账接口:支付宝、微信等具体的支付方法
     * @param uId
     * @param tradeId
     * @param amount
     * @return
     */
    public abstract String transfer(String uId, String tradeId, BigDecimal amount);

}

2.抽象扩展类:

package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @Description: 微信支付 
 * @Author: yangshilei
 */
@Slf4j
public class WxPay extends Pay {

    public WxPay(IPayModel iPayModel){
        super(iPayModel);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {
        log.info("选择微信渠道进行支付!uId={},tradeId={},amount={}",uId,tradeId,amount);

        boolean security = iPayModel.security(uId);

        if(!security){
            log.info("校验不通过,划账失败!");
            return "500";// 响应失败结果
        }
        log.info("校验通过,可以划账!");

        return "200";// 响应成功结果
    }

}
package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @Description: 支付宝支付
 * @Author: yangshilei
 */
@Slf4j
public class ZfbPay extends Pay {


    public ZfbPay(IPayModel iPayModel) {
        super(iPayModel);
    }

    @Override
    public String transfer(String uId, String tradeId, BigDecimal amount) {
        log.info("选择支付宝渠道进行支付!uId={},tradeId={},amount={}", uId, tradeId, amount);

        boolean security = iPayModel.security(uId);

        if (!security) {
            log.info("校验不通过,划账失败!");
            return "500";// 响应失败结果
        }
        log.info("校验通过,可以划账!");

        return "200";// 响应成功结果
    }
}

3.接口类:

package com.demo.spring.design.bridging_model;

/**
 * @Description: 支付模式,比如刷脸支付、指纹支付、密码支付等等
 * @Author: yangshilei
 */
public interface IPayModel {

    /**
     * 支付前的安全校验,只有安全校验通过后才能去付款;
     * @param id
     * @return
     */
    boolean security(String id);

}

4.接口实现类:

package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 密码支付模式
 * @Author: yangshilei
 */
@Slf4j
public class PayCypher implements IPayModel {

    @Override
    public boolean security(String id) {
        log.info("密码支付,风控校验指纹识别!");
        return true;
    }

}
package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 指纹支付模式
 * @Author: yangshilei
 */
@Slf4j
public class PayFingerMode implements IPayModel{

    @Override
    public boolean security(String id) {
        log.info("指纹支付,风控校验指纹识别!");
        return true;
    }
}
package com.demo.spring.design.bridging_model;

import lombok.extern.slf4j.Slf4j;

/**
 * @Description: 刷脸支付模式
 * @Author: yangshilei
 */
@Slf4j
public class PayFaceMode implements IPayModel {

    @Override
    public boolean security(String id) {
        log.info("人脸支付,风控校验指纹识别!");
        return true;
    }

}

最后就是测试类:

package com.demo.spring.design.bridging_model;

import java.math.BigDecimal;
import java.util.UUID;

public class BridgeTest {
   public static void main(String[] args) {
       Pay wxPay = new WxPay(new PayCypher());
       wxPay.transfer("0001",UUID.randomUUID().toString(),new BigDecimal(100));

       System.out.println("--------------------------------------------");

       Pay zfbPay = new ZfbPay(new PayFaceMode());
       zfbPay.transfer("002", UUID.randomUUID().toString(),new BigDecimal(50));
   }
}

执行的结果如下:

20:54:31.703 [main] INFO com.demo.spring.design.bridging_model.WxPay - 选择微信渠道进行支付!uId=0001,tradeId=b530bcbb-5dc6-497d-84e6-6155323b8b51,amount=100
20:54:31.706 [main] INFO com.demo.spring.design.bridging_model.PayCypher - 密码支付,风控校验指纹识别!
20:54:31.707 [main] INFO com.demo.spring.design.bridging_model.WxPay - 校验通过,可以划账!
--------------------------------------------
20:54:31.708 [main] INFO com.demo.spring.design.bridging_model.ZfbPay - 选择支付宝渠道进行支付!uId=002,tradeId=1498b697-f83e-4f31-88a2-01b5ea5e94c6,amount=50
20:54:31.708 [main] INFO com.demo.spring.design.bridging_model.PayFaceMode - 人脸支付,风控校验指纹识别!
20:54:31.708 [main] INFO com.demo.spring.design.bridging_model.ZfbPay - 校验通过,可以划账!

Process finished with exit code 0

好了,今天关于桥接模式的介绍就到此结束了,有不足的地方欢迎提出指正!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 07:54:27  更:2022-05-08 07:56:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:31:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码