十、桥接模式

news2024/11/28 16:43:28

一、什么是桥接模式

  桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

  桥接(Bridge)模式包含以下主要角色。

  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。

二、桥接模式的实现

1、实现化(Implementor)角色

/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/3 0003 16:21
 * @description 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
 */
public interface Implementor {
     void operationImpl();
}

2、具体实现化(Concrete Implementor)角色

/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/3 0003 16:23
 * @description 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
 */
public class ConcreteImplementor implements Implementor {
    @Override
    public void operationImpl() {
        System.out.println("operation...................");
    }
}

3、抽象化(Abstraction)角色


/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/3 0003 16:23
 * @description 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
 */
public abstract class Abstraction {
    protected Implementor implementor;

    protected Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    public abstract void operation();

}

4、扩展抽象化(Refined Abstraction)角色


/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/3 0003 16:24
 * @description 扩展抽象化(Refined    Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
 */
public class RefinedAbstraction extends Abstraction {

    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }

    @Override
    public void operation() {
        System.out.println("扩展抽象化(Refined Abstraction)角色被访问" );
        implementor.operationImpl();
    }
}

5、测试类


/**
 * @author FluffyCatkin
 * @version 1.0
 * @date 2020/1/3 0003 15:36
 * @description 桥接模式
 *
 * 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。
 *
 * 当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。
 * 桥接模式的定义与特点:
 * 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
 *
 * 桥接(Bridge)模式的优点是:
 * 由于抽象与实现分离,所以扩展能力强;
 * 其实现细节对客户透明。
 *
 * 缺点是:
 * 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
 *
 * 桥接模式的结构与实现:
 * 可以将抽象化部分与实现化部分分开,取消二者的继承关系,改用组合关系。
 *  模式的结构:
 * 桥接(Bridge)模式包含以下主要角色。抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
 * 扩展抽象化(Refined    Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
 * 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
 * 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
 */
public class Main {

    @Test
    public void briceTest(){
        Implementor implementor=new ConcreteImplementor();
        Abstraction abs=new RefinedAbstraction(implementor);
        abs.operation();
    }
}

运行结果:


扩展抽象化(Refined Abstraction)角色被访问
operation...................



Process finished with exit code 0

三、应用场景

  当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。

桥接模式通常适用于以下场景。

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

  桥接模式的一个常见使用场景就是替换继承。我们知道,继承拥有很多优点,比如,抽象、封装、多态等,父类封装共性,子类实现特性。继承可以很好的实现代码复用(封装)的功能,但这也是继承的一大缺点。

  因为父类拥有的方法,子类也会继承得到,无论子类需不需要,这说明继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为优先使用组合/聚合,而不是继承。

  很多时候,我们分不清该使用继承还是组合/聚合或其他方式等,其实可以从现实语义进行思考。因为软件最终还是提供给现实生活中的人使用的,是服务于人类社会的,软件是具备现实场景的。当我们从纯代码角度无法看清问题时,现实角度可能会提供更加开阔的思路。

四、优缺点分析

  桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放。这里将桥接模式的优缺点总结如下。

  桥接(Bridge)模式的优点是:

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

  缺点是:

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

代码地址:https://gitee.com/fluffycatkin/JavaDesignModel.git

image.png

原文出处:http://c.biancheng.net/view/1364.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浅析token

上一章节我们学习了cookie和session机制,但是他们都有一些缺点,所有这次我们来了解一个机制---token。 一、cookie和session的缺点 cookie信息存储在客户端浏览器上,安全性较低,所以浏览器加入了一些限制确保cookie不会被恶意使用…

对称二叉树判断

目录 题目题目要求示例 解答方法一、实现思路时间复杂度和空间复杂度代码 方法二、实现思路时间复杂度和空间复杂度代码 题目 对称二叉树判断 题目要求 题目链接 示例 解答 方法一、 递归法 实现思路 使用到了判断两棵二叉树是否相等的方法,只不过对称二叉树…

扫盲:常用NoSQL数据库

前言 关系型数据库产品很多,如 MySQL、Oracle、Microsoft SQL Sever 等,但它们的基本模型都是关系型数据模型。 非关系型数据库又称为:NoSQL ,没有统一的模型,而且是非关系型的。 常见的 NoSQL 数据库包括键值数据库、…

【Dots之006】PostTransformMatrix基础知识

一、基础介绍 PostTransformMatrix是一个组件;它用于不同比例对象的一个矩阵变换组件;当在Suscene中对GameObject比例变更的时候会发现以下情况: 1、当Gameobject的比例不相同的时候,在Entity Backing Previes窗口中可以看到已经…

0102阿里云配置3台ECS服务器-大数据学习

文章目录 1 前言1 配置VPC和子网2 创建安全组3 创建云服务器ECS3.1 规划配置3.2 配置 4 xshell连接服务器5 配置基础环境5.1 主机名映射5.2 ssh免密登录5.3 jdk 6 问题集6.1 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).6.2 用tar解压文件出现错误Not found i…

video标签在安卓手机内置浏览器上的播放问题

道阻且长,行而不辍,未来可期 问题: 在手机内置浏览上,虽然没有给video标签设置controls,但在内置浏览器上,就是会显示。 而且,video一旦自动播放,video的层级就会提升到最前,想设置一个盒子覆盖…

22道Mysql面试真题和答案

本专栏记录Java后端开发相关的面试题,欢迎大家阅读专栏的其他文章。 1.请介绍下联合索引的最左匹配原则 建立一个联合索引(a,b,c),相当于建立多个索引(a)(a,…

亚马逊宣布弃用低代码,Honeycode 服务即将停止。

AWS 宣布终止低代码服务 Honeycode。新客户不能注册或升级账户计划,现有客户的应用程序将在 2024 年 2 月 29 日前继续运行。在 2023 年 7 月 31 日之后,用户将不再需要支付 Honeycode 使用费。 Honeycode 是一项于2020年6月推出的完全托管服务&#xf…

C语言网络编程实现组播(多播)

1、组播IP划分 224.0.0.0~224.0.0.255 为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用; 224.0.1.0~224.0.1.255 是公用组播地址,可以用于Inter…

春秋云镜 CVE-2018-2894

春秋云镜 CVE-2018-2894 Weblogic 任意文件上传漏洞 靶标介绍 Oracle Fusion Middleware 的 Oracle WebLogic Server 组件中的漏洞(子组件:WLS - Web Services)。受影响的受支持版本包括 12.1.3.0、12.2.1.2 和 12.2.1.3。易于利用的漏洞允…

怎样做一个知识库网站

经济和信息技术的蓬勃发展,知识资源成为了企业非常重要的无形资产。 当前,企业的核心竞争力不仅取决于硬件设备、财务实力、资源多寡、人员数量等生产因素,更加取决于企业对于知识的掌握、运用、传承和创新。 制作企业知识库,传…

静态路由(详细理解+实例精讲)

系列文章目录 华为数通学习(6) 前言 一,静态路由 二,静态路由配置 三,缺省路由 四,缺省路由应用场景 总结 前言 随着华为公司的不断发展,数据通信这门技术也越来越重要,很多人…

js数据类型?如何判断js数据类型?

在JavaScript中,有以下几种数据类型: 基本数据类型(Primitive Data Types): String(字符串):表示文本数据,使用引号(单引号或双引号)括起来。Numb…

Android自定义view流程

Android自定义view流程,主要目的是总结实现过程中的思路以及一些需要注意的地方。 首先,我们先来看一张效果图: 实现逻辑 重新指定View宽高绘制外圆圆弧背景及进度绘制中圆圆弧背景及进度绘制内圆圆弧背景及进度 知识点 onMeasure 用于测量View的大小…

读SQL学习指南(第3版)笔记08_视图和索引

1. 精心设计的应用程序通常会在保持实现细节私有的同时公开公有接口,以便未来在不影响最终用户的情况下修改设计 2. 视图 2.1. 不同于数据表,视图并不涉及数据存储,不用担心视图会填满你的磁盘空间 2.2. 一种数据查询机制 2.3. 从用户的视…

基于swing的中国象棋java小游戏jsp源代码Mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、主要功能 可以实现双人下棋,可以悔棋,可…

R语言其他相关函数(各函数解析含实例,可供查询)

目录 一.函数相关 1.函数定义:function 2.调用文件:source 3. Call 4.Recall 5.browser 6.debug和undebug 7.trace 8.traceback 9.options 10.missing 11.nargs 12.stop 13.指定退出时执行的表达式 14.expression和eval 15.system.time 16. invisi…

Springboot+mybatis-plus+dynamic-datasource 切换数据源失败问题总结

Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结 文章目录 Springbootmybatis-plusdynamic-datasourceDruid 多数据源 切换数据源失败总结0.前言1. dynamic-datasource 切换数据源失败场景总结1. spring-batch整合情况下切换数据源异常解决办法&am…

Matlab图像处理-图像缩放

基本概念 图像缩放是指将给定的图像在x轴方向按比例缩放a倍,在y轴方向按比例缩放b倍,从而获得一幅新的图像。 如果ab,即在x轴方向和y轴方向缩放的比率相同,则称这样的比例缩放为图像的全比例缩放。 如果a≠b,图像比…

Spring: HiddenHttpMethodFilter的用法及原理

作用&#xff1a;将html表单提交的post请求转换为put请求或delete请求发给接口。 html不支持put和delete. 一、web.xml中配置过滤器 <filter><filter-name>HiddenHttpMethodFilter</filter-name><filter-class>org.springframework.web.filter.HiddenH…