设计模式篇---桥接模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*12=36支,毛笔需要3支毛笔+12个颜色=15个对象。当扩展一种型号的画笔时,蜡笔再需要12支,毛笔只需要一支。毛笔的这种思想的本质就是桥接模式。
颜色和型号是两个不同的变化维度,各自进行扩展理应该不影响另外一方,但蜡笔将颜色和型号糅合在了一起,这就产生了耦合,当一方发生扩展时势必要引起另一方的变动。

结构

桥接模式的结构图如下:
在这里插入图片描述
Abstraction(抽象类):用于定义抽象类的接口,其中定义了一个Implementor类型的对象。Abstraction中可以使用Implementor中的方法,通过关联的方式,而不是继承。该接口即可以包含抽象业务方法也可以包含具体业务方法;它可以理解为是毛笔。
RefinedAbstraction(扩充抽象类):它是Abstraction的实现。
Implementor(实现类接口):该接口提供一些基本的操作,并将这些基本的实现让子类来完成;它可以理解为是颜色。
ConcreteImplementor(具体实现类):它具体实现了Implementor接口,在不同的ConcreteImplementor中有不同的实现操作。

实例

现在以毛笔为例,实现它的demo
在这里插入图片描述
毛笔的抽象类

public abstract class Quill {protected Color color;protected Quill (Color color) {this.color = color;}public abstract void draw(Color color);}

颜色的抽象类,与毛笔的抽象类是桥接关系。

public abstract class Color {abstract void color();
}

大号毛笔

public class BigQuill extends Quill {public BigQuill(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("大号毛笔");color.color();}
}

中号毛笔

public class MediumQuill extends Quill {public MediumQuill(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("中号毛笔");color.color();}
}

小号毛笔

public class SmallQuill extends Quill  {public SmallQuill(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("小号毛笔");color.color();}
}

红色

public class RedColor extends Color {@Overridevoid color() {System.out.println("红色");}
}

绿色

public class GreenColor extends Color{@Overridevoid color() {System.out.println("绿色");}
}

黑色

public class BlackColor extends Color{@Overridevoid color() {System.out.println("黑色");}
}

客户端

public class Client {public static void main(String[] args) {Color redColor = new RedColor();Quill bigQuill = new BigQuill(redColor);bigQuill.draw(redColor);}
}

总结

在使用桥接模式时应该识别出一个类具有两个独立的变化维度,就比如毛笔本身具有一个维度,需要画出颜色就需要另外一个维度–颜色,颜色本身并不属于毛笔中的属性,它和毛笔本身是一个“设置”关系,所以它也可以作为一个抽象类,和毛笔进行桥接。
桥接模式使用的场景:
1、如果一个系统需要在抽象化和具体化之间增加更多的灵活性,可以考虑通过桥接模式使它们建立一个抽象的管理关系。
2、抽象部分和被“设置”部分可以通过继承的方式独立扩展而不相互影响。
3、一个类存在多个独立的变化维度,而这些维度需要独立的进行扩展。
4、不希望因为使用继承或多重继承而导致类的个数急剧增加的系统。

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

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

相关文章

什么是JavaScript中的IIFE(Immediately Invoked Function Expression)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ JavaScript中的IIFE⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们…

【JavaEE】多线程(三)

多线程(三) 续上文,多线程(二),我们已经讲了 创建线程Thread的一些重要的属性和方法 那么接下来,我们继续来体会了解多线程吧~ 文章目录 多线程(三)线程启动 startsta…

Git学习笔记4

GitHub是目前最火的开源项目代码托管平台。它是基于web的Git仓库,提供公有仓库和私有仓库,但私有仓库是需要付费的。 到Github上找类似的项目软件。 GitLab可以创建免费的私有仓库。 GitLab是利用 Ruby开发的一个开源的版本管理系统,实现一个…

【搭建私人图床】使用LightPicture开源搭建图片管理系统并远程访问

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进,功能也越来越多,而手机…

基于STM32+华为云IOT设计的智能车库管理系统

一、项目介绍 随着城市化进程和汽车拥有率的不断提高,停车难的问题也日益凸显。在城市中,停车场是一个非常重要的基础设施,但是传统的停车场管理方式存在很多问题,比如车位难以管理、停车费用不透明等。为了解决这些问题&#xf…

时间轮算法

思考 假如现在有个任务需要3s后执行,你会如何实现? 线程实现:让线程休眠3s 如果存在大量任务时,每个任务都需要一个单独的线程,那这个方案的消耗是极其巨大的,那么如何实现高效的调度呢? 时…

goadmin 学习笔记

1.安装命令行 Following three steps to run it. Note: now you can quickly start by doing like this. $ go install github.com/GoAdminGroup/admlatest $ mkdir new_project && cd new_project $ adm init Or (use adm whose version higher or equal than v1.…

2023年信创云管平台选哪家?咨询电话多少?

随着云计算和信创国产化的快速发展,越来越多企业需要支持信创系统的云管平台。但很多企业不知道市面上信创云管平台有哪些,也不知道选哪家?这里我们小编就给大家来回答一下。 2023年信创云管平台选哪家?咨询电话多少?…

剪映软件专业版的操作与使用,电脑版与手机版APP同步讲解

一、教程描述 什么是剪映?抖音官方推出的一款视频编辑工具,用于短视频的剪辑制作和在线发布,主要在手机端使用,同时支持PC端,操作简单易上手,功能也十分强大,使用过剪映的用户,都将…

基于量子粒子群算法(QPSO)优化LSTM的风电、负荷等时间序列预测算法(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

华硕 ASUS U303L 换国产致钛SSD固态硬盘记

ASUS U303L尽享丝滑体验——换装国产致钛SC001 1T SSD 华硕笔记本电脑款式年代久远,东芝的机械硬盘,没有安装SSD的笔记本电脑用久了,卡顿是难免的事情。更换国产致钛固态硬盘后,体验丝一般的感觉,非常成功&#xff01…

nginx: 部署前端项目的详细步骤(vue项目build打包+nginx部署)

目录 第一章 前言 第二章 准备工作 2.1 项目打包理解 2.1.1 打包命令 2.1.2 理解npm run serve/dev 和 npm run build命令 2.2 nginx参数配置理解 2.2.1 nginx常用基本命令 2.2.2 默认配置 2.2.3 搭建不同网站的站点 2.2.4 禁止访问的目录以及一键申请SSL证书验证目录…

【JDK 8-函数式编程】4.4 Supplier

一、Supplier 接口 二、实战 Stage 1: 创建 Student 类 Stage 2: 创建方法 Stage 3: 调用方法 Stage 4: 执行结果 一、Supplier 接口 供给型 接口: 无入参,有返回值(T : 出参类型) 调用方法: T get(); 用途: 如 无参的工厂方法&#x…

【js逆向实战】某讯漫画网站图片逆向

写在前面 本来想更安全开发系列,想着复现一下长亭的rad。里面涉及到好多js逆向的知识,正好学习了一波,本身js逆向也是一个大坑,说不定也能完善好多以前的爬虫项目。 学了也有一段时间了,来练练手吧 涉及到具体的隐私…

service

title: “Service” createTime: 2022-02-11T11:23:2008:00 updateTime: 2022-02-11T11:23:2008:00 draft: false author: “name” tags: [“service”] categories: [“linux”] description: “测试的” linux的Service之旅 1.service 服务权限 systemd有系统和用户区分&…

2023年9月26日,历史上的今天大事件早读

1620年9月26日大明皇帝朱常洛驾崩 1815年9月26日俄、普、奥三国在巴黎发表缔结“神圣同盟” 1841年9月26日清代思想家、诗人龚自珍逝世 1849年9月26日“生理学之父”巴甫洛夫诞生 1909年9月26日云南陆军讲武堂创办 1953年9月26日画家徐悲鸿逝世 1980年9月26日国际宇航联合…

【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25

目录 前言初始化和清理的概念构造函数和析构函数的作用构造函数的作用析构函数的作用 使用构造函数和析构函数的注意事项默认的构造函数和析构函数结束语 前言 在使用c语言开发的项目场景中,我们往往会遇到申请空间的需求,同时也肯定遇到过程序运行一段…

phpstudy2016 RCE漏洞验证

文章目录 漏洞描述漏洞验证 漏洞描述 PHPStudyRCE(Remote Code Execution),也称为phpstudy_backdoor漏洞,是指PHPStudy软件中存在的一个远程代码执行漏洞。 漏洞验证 打开phpstudy2016,用bp自带的浏览器访问www目录下…

【Verilog 教程】4.8Verilog 过程连续赋值

关键词:deassign,force,release 过程连续赋值是过程赋值的一种。这种赋值语句能够替换其他所有 wire 或 reg 的赋值,改写了 wire 或 reg 型变量的当前值。 与过程赋值不同的是,过程连续赋值的表达式能被连续的驱动到 …

大数据Flink(八十六):DML:Group 聚合和Over 聚合

文章目录 DML:Group 聚合和Over 聚合 一、DML:Group 聚合