当前位置: 首页 > news >正文

设计模式—桥接模式

定义:

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

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

 结构:

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

UML类图:

实例:

抽象化角色

package com.study.main.Bridging;

import java.math.BigDecimal;

public abstract class Pay {
    IPayMode payMode;

    public Pay(IPayMode payMode) {
        this.payMode = payMode;
    }

    abstract String transfer(String uid, BigDecimal amount);
}

 扩展抽象化角色

package com.study.main.Bridging;

import java.math.BigDecimal;

public class WXPay extends Pay{
    public WXPay(IPayMode payMode) {
        super(payMode);
    }

    @Override
    String transfer(String uid, BigDecimal amount) {
        boolean security = payMode.security(uid);
        if(security){
            System.out.println("恭喜您,您用ZFB成功支付了"+amount+"元");
        }
        return uid;

    }
}
package com.study.main.Bridging;

import java.math.BigDecimal;

public class ZFBPay extends Pay{
    public ZFBPay(IPayMode payMode) {
        super(payMode);
    }

    @Override
    String transfer(String uid, BigDecimal amount) {
        boolean security = payMode.security(uid);
        if(security){
            System.out.println("恭喜您,您用ZFB成功支付了"+amount+"元");
        }
        return uid;
    }
}

 实现化角色

package com.study.main.Bridging;

public interface IPayMode {
    boolean security(String id);
}

具体实现化角色

package com.study.main.Bridging;

public class PasswordTypeMethodPay implements IPayMode{
    @Override
    public boolean security(String id) {
        System.out.println("使用密码支付,验证id为" +id );
        return !id.isBlank();
    }
}
package com.study.main.Bridging;

public class FaceTypeMethodPay implements IPayMode{
    @Override
    public boolean security(String id) {
        System.out.println("使用面容支付,验证id为" +id );
        return !id.isBlank();
    }
}

调用

package com.study.main.Bridging;

import java.math.BigDecimal;

public class BridginMain {
    public static void main(String[] args) {
        IPayMode faceTypeMethodPay = new FaceTypeMethodPay();
        WXPay wxPay = new WXPay(faceTypeMethodPay);
        wxPay.transfer("1111111-2222-3333", BigDecimal.valueOf(200));
        IPayMode passwordTypeMethodPay = new PasswordTypeMethodPay();
        ZFBPay zfbPay = new ZFBPay(passwordTypeMethodPay);
        zfbPay.transfer("222-33-239-2323", BigDecimal.valueOf(30000));
    }
}

运行&&结果  

桥接模式在源码中应用:

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

场景分析:

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

桥接模式优缺点 :

优点:

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

缺点:

  • 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  • 桥接模式增加了系统的理解与设计难度:因为聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度

文章转载自:
http://chatoyance.bdypl.cn
http://brassfounding.bdypl.cn
http://byrd.bdypl.cn
http://cannabin.bdypl.cn
http://campshed.bdypl.cn
http://chenag.bdypl.cn
http://botheration.bdypl.cn
http://bipartisan.bdypl.cn
http://barbell.bdypl.cn
http://acrodromous.bdypl.cn
http://boride.bdypl.cn
http://archfiend.bdypl.cn
http://affirmable.bdypl.cn
http://cheat.bdypl.cn
http://botswana.bdypl.cn
http://augustinianism.bdypl.cn
http://chainstitch.bdypl.cn
http://bimanal.bdypl.cn
http://acetifier.bdypl.cn
http://arillate.bdypl.cn
http://barrelhouse.bdypl.cn
http://afterhours.bdypl.cn
http://chloroacetophenone.bdypl.cn
http://antemeridiem.bdypl.cn
http://bypast.bdypl.cn
http://ceratodus.bdypl.cn
http://ameliorant.bdypl.cn
http://cabinetmaker.bdypl.cn
http://brownstone.bdypl.cn
http://ang.bdypl.cn
http://www.dtcms.com/a/9133.html

相关文章:

  • SQL中如何添加数据
  • 安装zabbix
  • 风车IM即时通讯系统APP源码DJ2403版完整苹果安卓教程
  • Redis快速入门
  • Java基于SpringBoot+Vue的人事管理系统,附源码
  • 设计模式学习笔记 - 规范与重构 - 5.如何通过封装、抽象、模块化、中间层解耦代码?
  • java kotlin混合变成java编译提示找不到符号
  • Android Studio Iguana | 2023.2.1版本
  • C++基础4:C++的指针与引用
  • 网站被插入虚假恶意链接怎么办?
  • 嵌入式学习35-网络通信UDP聊天及TCP
  • 智慧城市与智慧乡村:共创城乡一体化新局面
  • SQL 中: 索引的建立和删除
  • 科技云报道:阿里云降价,京东云跟进,谁能打赢云计算价格战?
  • python中的错误和异常
  • git push 跟 git push origin master的区别
  • huggingface快速下载
  • 数据库-第八/九章 数据库编程和优化【期末复习|考研复习】
  • MySQL 学习笔记(基础篇 Day3)
  • qt练习案例
  • Visual studio编译器报1个无法解析的外部命令
  • Linux下阻塞IO驱动实验实例二
  • 软考网络工程师 第五章 第一节 移动通信与5G
  • 每日一练:LeeCode-35、搜索插入位置【数组】、面试题 01.08. 零矩阵【数组】、面试题 01.07. 旋转矩阵【数组+行列翻转】
  • 【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合
  • 5分钟,我把网站性能优化了3倍
  • C++程序设计-第六/七/八章 运算符重载/包含与继承/虚函数和多态性【期末复习|考研复习】
  • 【AI视野·今日NLP 自然语言处理论文速览 第八十三期】Wed, 6 Mar 2024
  • 大语言模型中,role为user、assistant、system有什么区别
  • Django工具