设计模式13——桥接模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

桥接模式(Bridge)

是一种结构型模式。

目录

一、概述

1.1、主要的角色(如果有点懵的话就先跳过着小部分):

1.2、直观的理解桥接模式要干什么:

1.3、上述手机应用例子的UML图:

二、桥接模式的模板

2.1、对象之间的关系用UML图表示如下:

2.2、Java版的代码如下:


一、概述

1、将抽象部分与它的实现部分分离,使它们都可以独立地变化;
2、(实现:是指抽象类以及抽象类的派生类,对于它们的实现类。)这些实现类应该分离;
3、和 合成|聚合复用原则 相关;
4、实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。

1.1、主要的角色(如果有点懵的话就先跳过)

主要的角色分两种,但从代码(或技术)实现的角度看(为了充分使用面向对象语言的3大特性封装、继承、多态,还另外需要抽象类或接口)可能有4个:

  1. 实现类:实现类的抽象类或接口 +实现类
  2. 新提取的类:新提取的类的抽象类或接口 +新提取的类的实现类

1.2、直观的理解桥接模式要干什么:

以手机应用软件为例,我们有各种需要,如想和人聊天,那么就用微信;如想购物,那么就用淘宝等。并且对于我们不同的手机,有着不同的操作系统,一样可以使用这些软件来满足我们某方面的需求。

现在假设你是应用程序开发者,你需要在开发出微信和淘宝,并且你还要让它们可以在鸿蒙或者苹果手机上运行:

如果按照以前的思路,那肯定是把微信开发两个版本分别运行在鸿蒙和苹果系统上,同样淘宝也是开发两个,这个例子比较简单,这样做的话只要设计四个对象即可,但万一又有新的需求这样就并不一定好使了。就假设现在要开发10个软件,并且都适配4个系统,那么按照以前的思路,那你需要设计 10*4=40 个对象, 如果再多点呢,那工作量将是难以想象,并且你也清除有很多重复适配工作的。

我们可以这样,把操作系统和应用软件分开看:

  • 应用软件都定义一个统一的接口,每个应用软件只针对自己要完成的功能进行实现,如微信对接口具体实现的是聊天,淘宝对接口的具体实现是购物。
  • 操作系统也都定义一个统一的运行应用程序的接口,每个操作系统针对接口的具体实现是完成对任何一个应用软件对象的正常运行。

这样再结合多态,就可以实现上面概念里的第一句话,‘将抽象部分与它的实现部分分离,使它们都可以独立地变化’,也就是抽象分离出两部分:操作系统 + 应用软件;

并且它们两可以独立增加或减少。

此时你可能会发现对于手机应用程序来说他有着不同的维度,如功能维度和运行环境维度。像这种一个事物但是对应多个维度,也就是说某个目标对象可以被抽象出多个抽象类,那么就可以尝试使用桥接模式,这样也就符合合成|聚合复用原则。

(想简单了解原则的可以点击下面链接)

设计模式2——原则篇极简版

1.3、上述手机应用例子的UML图:

这样子,把操作系统和应用软件分开,那么就需要建6个类。(对于之前说的‘要开发10个软件,并且都适配3个系统’的话,就不需要40个对象了,而是10+4+2=16个对象。其中有2个是操作系统和应用软件的抽象类)

如何使用?(也就是主程序要怎么调用这些对象)

先填装在使用。

如:可以给鸿蒙系统填装一个应用,然后调用操作系统的运行接口就可以让此应用运行。

(注:本例是以操作系统和应用程序看成一个一个类对象为角度,从而可以让操作系统和应用各自实现各自的统一接口,而现实生活中并非如此) 

对应上文的角色分类,在本例种,把应用软件看为解决原本问题的实现类,而操作系统是在此基础上又新提取或抽象出的新提取的类。从代码角度讲:新提取的类是主程序最终调用的类,而实现类是被新提取的类调用,刚好对应我们点击图标后,操作系统接收到我们触摸屏幕的信号,然后再启动应用程序。

(再举例:物品-----对应颜色维度和形状维度)

二、桥接模式的模板

2.1、对象之间的关系用UML图表示如下:

2.2、Java版的代码如下:

实现类(抽象):

abstract class Implementor {
    public abstract void operation();
}

具体的实现类1:

public class ConcreteImplementor1 extends Implementor{
    @Override
    public void operation() {
        System.out.println("具体实现1的方法执行");
    }
}

具体的实现类2:

public class ConcreteImplementor2 extends Implementor{
    @Override
    public void operation() {
        System.out.println("具体实现2的方法执行");
    }
}

抽象分类对象(抽象):

abstract class Abstraction {
    protected Implementor implementor;

    public void setImplementor(Implementor implementor) {
        this.implementor = implementor;
    }

    public abstract void operation();
}

提炼后的抽象分类对象A:

public class RefinedAbstractionA extends Abstraction {
    @Override
    public void operation() {
        System.out.println("提炼后的A");
        implementor.operation();
    }
}

提炼后的抽象分类对象B:

public class RefinedAbstractionB extends Abstraction {
    @Override
    public void operation() {
        System.out.println("提炼后的B");
        implementor.operation();
    }
}

主程序(发起请求的类):

public class Main {
    public static void main(String[] args) {
        Abstraction abstraction;
        abstraction = new RefinedAbstractionA();
        abstraction.setImplementor(new ConcreteImplementor1());
        abstraction.operation();

        abstraction.setImplementor(new ConcreteImplementor2());
        abstraction.operation();

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

        abstraction = new RefinedAbstractionB();
        abstraction.setImplementor(new ConcreteImplementor1());
        abstraction.operation();

        abstraction.setImplementor(new ConcreteImplementor2());
        abstraction.operation();
    }
}

这里暂时就不再例其它编程语言的例子了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用LabVIEW开发RFID读卡器程序

使用LabVIEW开发RFID读卡器程序,涵盖硬件选择、初始化、数据读取与处理的整个流程。通过详细的开发步骤和示例代码,展示LabVIEW在快速开发和调试RFID应用中的优势,使用户能有效实现RFID技术在各类项目中的应用。 工作原理 RFID(…

2024爆款神器!会声会影2024旗舰版,让你的视频制作技能暴涨,不学真的亏大了!

在数字内容创作的时代,视频编辑已经成为连接创意与现实的重要桥梁。无论是个人Vlog制作、在线教育课程、企业宣传还是专业影视制作,高效而强大的视频编辑软件成为了必不可少的工具。会声会影2024旗舰版,作为一款集先进技术与用户友好界面设计…

分享目前堪称最好用的车机桌面app,支持画中画模式!

好用的车机桌面了,支持悬浮画中画! 如果你想改变单调的车机桌面,那么这篇文章你不要错过了!支持地图悬浮、画中画的车机桌面,不要错过! 今天阿星给大家分享3款好用、好看的大屏桌面软件,重要的…

内网穿透端口映射内外网反弹 shell 回顾

内网穿透&端口映射&内外网反弹 shell 回顾 内网概念 我们常说的内网,一般指的是非公有 IPv4 地址的网络比如学校机房里的电脑一般为私有网络,家里的网络也是私有网络 私有网络的范围与划分 ipaddressareaA 类地址10.0.0.0~10.255.…

【408精华知识】指令字长、存储字长、机器字长大总结!

文章目录 一、三种字长二、三种字长之间的关系三、三种字长与部件位数之间的关系 一、三种字长 机器字长:等于字长,CPU一次能够处理的数据的位数。通常等于寄存器、ALU的位数。例子:windows 64位/32位,这里的64位和32位指的就是该…

工博科技联手伯尼纳,共谋食品包装外贸行业新市场,助力全球市场拓展!

4月11日,伯尼纳贸易(江苏)有限公司(以下简称“伯尼纳”)SAP项目正式启动,双方项目组成员在福建厦门出席本次项目启动会。伯尼纳SAP项目的启动标志着企业业财信息化建设进入了一个新的历程。 实现业财一体化…

9.4 Go语言入门(运算符)

Go语言入门(运算符) 目录三、运算符1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 其他运算符7. 运算符优先级 目录 Go 语言(Golang)是一种静态类型、编译型语言,由 Google 开发,专注…

【python】python商家会员数据分析可视化(源码+数据集+课程报告论文)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

markdown画时序图的时候,如何自动显示每一条时序的序号

1: 现象描述 今天画时序图的时候,发现时序上面没有显示序号,看起来不够清晰,只有单纯的说明; 如下图所示 刚测试CSDN的时序图,默认是带序号的,看起来和实际使用的markdown工具有关系; 2:解决办…

Ubuntu 20.04 上安装和配置 VNC

先决条件 请确保以具有 sudo 权限的用户身份登录。建议使用具有 sudo 权限的普通用户进行处理,而不是直接使用 root 用户。创建用户并加入 sudoers 可自行百度。 安装桌面环境 大多数服务器没有安装桌面环境,因此我们首先要安装轻量级桌面环境。 Ubu…

Slash后台管理系统源码阅读笔记 后面面板中的折线图统计卡片是怎么实现的?

之前的笔记发表在博客和公众号以后,得到了一部分同学的喜爱的认可,所以今天继续。 目前这个管理系统的代码已经处理了一小部分: 接下来,我们看看第二栏那三个折线图统计卡片是怎么实现的。 这三个卡片还是使用的 antd 一行三列…

【C语言】文件操作(超级详细)

如果没有文件,我们写的程序的数据都存储在内存中,当程序退出,内存回收,数据就丢失了,下次再运行程序,已经看不到上次运行的数据了,而为了将数据持久性的保存,就需要使用文件。 一、…

什么是Capto刀柄,一起来认识一下

大家好,今天咱们不聊齿轮,说一说一款刀柄的相关内容。目前,高速加工中心的主轴转速可以达到10,000——50,000r /min ,极大地提高了生产率。高速加工工具系统的主要作用是保证刀具在机床主轴中的精确定位,将主轴的运动和…

请把「睡一个好觉」,当成一天里最重要的事来管理

我发现许多人都有这么一种情况:明明知道睡眠很重要,但却总是有意无意地熬夜。 比如: 给自己排了太多的学习和工作量,一不小心就到了凌晨一两点; 总觉得过去的一天什么都没干,宁愿在网上闲逛,也不…

数据持久化第六课-ASP.NET运行机制

数据持久化第六课-ASP.NET运行机制 一.预习笔记 1.动态网页的工作机制通常分为以下几个阶段: 1)使用动态Web开发技术编写Web应用程序,并部署到Web服务器。 2)客户端通过在浏览器中输入地址,请求动态页面。 3&#…

一个投稿好方法让你的文章早日发表

作为一名单位信息宣传员,我初入此行时,满腔热情,怀揣着传播单位价值、展示团队风采的理想,一头扎进了稿件撰写的海洋。我的目标很简单,就是通过文字的力量,让外界听到我们的声音,感受到我们的活力。然而,理想很丰满,现实却给我上了生动的一课。 起初,我遵循传统路径,选择了一家…

【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf

联想笔记本 y9000p创建python工程: 使用langchain支持openai的向量化embedding安装软件包 发现没有openai ,添加软件仓库打开工具窗口 点击设置

23种设计模式之策略模式

策略模式详解:模式简介、动机、结构及应用 一、策略模式简介1.1 定义1.2 模式类型1.3 主要作用1.4 优点1.5 缺点 二、模式动机三、模式结构四、策略模式的实现4.1 步骤一:定义策略接口4.2 步骤二:实现具体策略类4.3 步骤三:创建上…

智能未来,触手可及,畅享移动云

目录 一、简介 二、移动云强大优势 1. 强大的网络基础设施 2. 可靠服务 3. 丰富产品线 4. 技术应用 5. 优惠价格策略 三、多商对比 网络优势 四、移动云的未来发展 五、实战应用 5.1 服务器选购 ​编辑5.2 服务器启动 5.3 实例操作 六、移动云的服务优势 6.1 客…

AppInventor2 代码调试方法,99%的人可能不知道这种方式!

AppInventor2 基本上所有调试App的前提是安装好AI伴侣,并与AI伴侣连接后进行,我们在设计界面的每次改动,都会实时的反映在AI伴侣中。 AI伴侣可以运行在手机上,也可以是安卓模拟器。 AI伴侣具体的安装及连接步骤请参考&#xff1…