• 设计模式—桥接模式


    定义:

    桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。

    本章代码:小麻雀icknn/设计模式练习 - Gitee.com 

     结构:

    • 抽象化(Abstraction)角色:抽象化给出的定义,并保存一个对实现化对象的引用。
    • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
    • 实现化(Implementor)角色:这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
    • 具体实现化(Concrete Implementor)角色:这个角色给出实现化角色接口的具体实现。

    UML类图:

    实例:

    抽象化角色

    1. package com.study.main.Bridging;
    2. import java.math.BigDecimal;
    3. public abstract class Pay {
    4. IPayMode payMode;
    5. public Pay(IPayMode payMode) {
    6. this.payMode = payMode;
    7. }
    8. abstract String transfer(String uid, BigDecimal amount);
    9. }

     扩展抽象化角色

    1. package com.study.main.Bridging;
    2. import java.math.BigDecimal;
    3. public class WXPay extends Pay{
    4. public WXPay(IPayMode payMode) {
    5. super(payMode);
    6. }
    7. @Override
    8. String transfer(String uid, BigDecimal amount) {
    9. boolean security = payMode.security(uid);
    10. if(security){
    11. System.out.println("恭喜您,您用ZFB成功支付了"+amount+"元");
    12. }
    13. return uid;
    14. }
    15. }
    1. package com.study.main.Bridging;
    2. import java.math.BigDecimal;
    3. public class ZFBPay extends Pay{
    4. public ZFBPay(IPayMode payMode) {
    5. super(payMode);
    6. }
    7. @Override
    8. String transfer(String uid, BigDecimal amount) {
    9. boolean security = payMode.security(uid);
    10. if(security){
    11. System.out.println("恭喜您,您用ZFB成功支付了"+amount+"元");
    12. }
    13. return uid;
    14. }
    15. }

     实现化角色

    1. package com.study.main.Bridging;
    2. public interface IPayMode {
    3. boolean security(String id);
    4. }

    具体实现化角色

    1. package com.study.main.Bridging;
    2. public class PasswordTypeMethodPay implements IPayMode{
    3. @Override
    4. public boolean security(String id) {
    5. System.out.println("使用密码支付,验证id为" +id );
    6. return !id.isBlank();
    7. }
    8. }
    1. package com.study.main.Bridging;
    2. public class FaceTypeMethodPay implements IPayMode{
    3. @Override
    4. public boolean security(String id) {
    5. System.out.println("使用面容支付,验证id为" +id );
    6. return !id.isBlank();
    7. }
    8. }

    调用

    1. package com.study.main.Bridging;
    2. import java.math.BigDecimal;
    3. public class BridginMain {
    4. public static void main(String[] args) {
    5. IPayMode faceTypeMethodPay = new FaceTypeMethodPay();
    6. WXPay wxPay = new WXPay(faceTypeMethodPay);
    7. wxPay.transfer("1111111-2222-3333", BigDecimal.valueOf(200));
    8. IPayMode passwordTypeMethodPay = new PasswordTypeMethodPay();
    9. ZFBPay zfbPay = new ZFBPay(passwordTypeMethodPay);
    10. zfbPay.transfer("222-33-239-2323", BigDecimal.valueOf(30000));
    11. }
    12. }

    运行&&结果  

    桥接模式在源码中应用:

    特别简短的代码,其实只调用了DriverManager中的registerDriver方法来注册驱动。当驱动注册完成后,我们就会开始调用DriverManager中的getconnection方法了 

    场景分析:

    • 抽象实现灵活 : 抽象 和 具体实现 之间 , 需要 增加更多灵活性 的情况下 , 适合使用桥接模式 ;
    • 使用 桥接模式 , 可以 避免在这两个层次之间 , 建立静态的继承关系 , 通过 桥接模式 在二者之间建立 关联关系 ;
    • 抽象 和 实现 都可以 各自 以继承的方式扩展 , 互不影响 ;
    • 可以动态的 将 抽象 的子类对象 和 实现 的子类对象 进行组合 , 在系统中 , 抽象 和 实现 之间进行了解耦 ;
    • 独立变化维度 : 一个类存在 2 22 个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展 ;
    • 抽象部分可以 独立扩展 , 具体实现的部分 , 也可以独立扩展 ;不使用继承 : 不希望使用继承 , 或 因多层继承导致系统类的个数增加 ;

    桥接模式优缺点 :

    优点:

    • 抽象和实现的分离。
    • 优秀的扩展能力。
    • 经常遇到一些可以通过两个或多个维度划分的事物,第一种解决方式就是多层继承,但是复用性比较差,同时类的个数也会很多,桥接模式是改进其的更好办法
    • 桥接模式增强了系统的扩展性,在两个维度中扩展任意一个维度都不需要修改原有代码,符合开闭原则

    缺点:

    • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
    • 桥接模式增加了系统的理解与设计难度:因为聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度
  • 相关阅读:
    simpleini库的介绍和使用(面向业务编程-格式处理)
    机器比人更需要通证
    【C++】string类的介绍与使用
    Dubbo注册中心(一)——概述
    5.Python-使用XMLHttpRequest对象来发送Ajax请求
    LeetCode-775-全局倒置与局部倒置
    leetcode 221 最大正方形 + 1277 统计全为1的正方形子矩阵
    【机器学习】集成学习(实战)
    Ubuntu修改下载源
    C语言错题总结
  • 原文地址:https://blog.csdn.net/qq_33839972/article/details/136491618