笨蛋学设计模式结构型模式-桥接模式【11】

结构型模式-桥接模式

    • 7.5桥接模式
      • 7.5.1概念
      • 7.5.2场景
      • 7.5.3优势 / 劣势
      • 7.5.4桥接模式可分为
      • 7.5.5外观模式
      • 7.5.6实战
        • 7.5.6.1题目描述
        • 7.5.6.2输入描述
        • 7.5.6.3输出描述
        • 7.5.6.4实战
      • 7.5.7总结
      • 桥接模式

7.5桥接模式

7.5.1概念

​ 桥接模式主要将抽象部分与实现部分分离开来,使得它们可以相互独立地变化。抽象部分定义了一个抽象类或接口,包含一些基本操作以及包含一个指向实现部分的引用。实现部分也是一个抽象类或接口,定义了一些具体的操作。

7.5.2场景

​ 比如在路上随处可见的汽车,汽车和引擎之间可以使用桥接模式。抽象部分可以是一个汽车的抽象类,实现部分可以是不同类型的汽车,如轿车、SUV等。而引擎可以是抽象部分的扩展类,实现部分可以是不同的引擎类型,如电动、燃油、混油引擎等。而我们可以创建多个引擎和汽车,而每个引擎和汽车之间都是独立的,通过桥接模式将不同类型的汽车和引擎进行组合,实现灵活的汽车配置。

7.5.3优势 / 劣势

  • 易维护:分离抽象和实现部分,使得系统更容易扩展和维护
  • 可复用性:提高系统的可复用性,使得在不同的系统中重用抽象 / 实现部分

  • 应用场景有限:主要适用于两个独立变化的维度,且维度之间都需要进行扩展
  • 增加理解难度:要求开发者针对抽象层进行编程,增加了理解和设计难度

7.5.4桥接模式可分为

  • 抽象Abstraction:一般是抽象类,定义抽象部分的接口,维护一个对实现的引用
  • 修正抽象RefinedAbstraction:对抽象接口进行扩展,通常对抽象化的不同维度进行变化或定制
  • 实现Implementor:定义实现部分的接口,提供具体的实现。该接口通常是抽象化接口的实现
  • 具体实现ConcreteImplementor:实现实现化接口的具体类,由这些类负责实现实现化接口定义的具体操作

7.5.5外观模式

package com.technologystatck.designpattern.mode.bridging;public class Bridging {public static void main(String[] args) {//创建具体实现化对象Implementor implementationA = new ConcreteImplementationA();Implementor implementationB = new ConcreteImplementationB();//使用扩充抽象化对象,将实现化对象传递进去Abstraction abstractionA = new RefinedAbstraction(implementationA);Abstraction abstractionB = new RefinedAbstraction(implementationB);//调用抽象化的操作abstractionA.operation();abstractionB.operation();System.out.println("--------------------------------------------");ATV atv = new ATV();BTV btv = new BTV();RemoteControl basicRemoteForA = new BasicRemoteControl(atv);RemoteControl basicRemoteForB = new BasicRemoteControl(btv);basicRemoteForA.turnOn();basicRemoteForA.turnOff();basicRemoteForA.tuneChannel();basicRemoteForB.turnOn();basicRemoteForB.turnOff();basicRemoteForB.tuneChannel();}
}//创建实现接口
interface Implementor{void operationImpl();
}//用电视举例,电视具有开关和切换频道的功能
interface TV{void on();void off();void tuneChannel();
}
//创建具体实现类:实际提供服务的对象
class ConcreteImplementationA implements Implementor{@Overridepublic void operationImpl() {//具体实现ASystem.out.println("具体实现A");}
}class ConcreteImplementationB implements Implementor{@Overridepublic void operationImpl() {//具体实现BSystem.out.println("具体实现B");}
}//用电视举例,创建具体实现类
class ATV implements TV{@Overridepublic void on() {System.out.println("A TV is ON");}@Overridepublic void off() {System.out.println("A TV is OFF");}@Overridepublic void tuneChannel() {System.out.println("Turning A TV channel");}
}
class BTV implements TV{@Overridepublic void on() {System.out.println("B TV is ON");}@Overridepublic void off() {System.out.println("B TV is OFF");}@Overridepublic void tuneChannel() {System.out.println("Turning B TV channel");}
}//创建抽象类:包含一个对实现化接口的引用
abstract class Abstraction {protected Implementor implementor;public Abstraction(Implementor implementor) {this.implementor = implementor;}public void operation() {this.implementor.operationImpl();}
}
//用电视举例
abstract class RemoteControl{//持有一个实现化接口的引用protected TV tv;public RemoteControl(TV tv) {this.tv=tv;}abstract void turnOn();abstract void turnOff();abstract void tuneChannel();
}//实现抽象类,创建RefinedAbstraction类
class RefinedAbstraction extends Abstraction {private Implementor implementor;public RefinedAbstraction(Implementor implementor) {super(implementor);this.implementor=implementor;}@Overridepublic void operation() {this.implementor.operationImpl();}
}class BasicRemoteControl extends RemoteControl{public BasicRemoteControl(TV tv) {super(tv);}@Overridevoid turnOn() {tv.on();}@Overridevoid turnOff() {tv.off();}@Overridevoid tuneChannel() {tv.tuneChannel();}
}

7.5.6实战

7.5.6.1题目描述

小明家有一个万能遥控器,能够支持多个品牌的电视。每个电视可以执行开机、关机和切换频道的操作,请你使用桥接模式模拟这个操作。

7.5.6.2输入描述

第一行是一个整数 N(1 <= N <= 100),表示后面有 N 行输入。

接下来的 N 行,每行包含两个数字。第一个数字表示创建某个品牌的遥控和电视,第二个数字表示执行的操作。

其中,0 表示创建 Sony 品牌的电视,1 表示创建 TCL 品牌的遥控和电视;

2 表示开启电视、3表示关闭电视,4表示切换频道。

7.5.6.3输出描述

对于每个操作,输出相应的执行结果。

7.5.6.4实战
package com.technologystatck.designpattern.mode.bridging;import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int nums = scanner.nextInt();scanner.nextLine();for(int i=0;i<nums;i++) {String[] input = scanner.nextLine().split(" ");int brand = Integer.parseInt(input[0]);int operation = Integer.parseInt(input[1]);//根据输入的不同,执行对应的操作UniversalRemoteTV universalRemoteTV= null;if(brand==0) {universalRemoteTV = new SonyTV();}else if(brand ==1) {universalRemoteTV = new TCLTV();}AbstractionTV abstractionTV=null;if(operation==2) {abstractionTV = new PowerOperation(universalRemoteTV);}else if(operation ==3) {abstractionTV = new OffOperation(universalRemoteTV);}else if (operation ==4) {abstractionTV = new ChannelOperation(universalRemoteTV);}abstractionTV.performOperation();}}
}//定义实现接口
interface UniversalRemoteTV{//定义远程遥控电视的三个功能void onTV();void offTV();void channelTV();
}//创建两个品牌电视具体实现类
class SonyTV implements UniversalRemoteTV{@Overridepublic void onTV() {System.out.println("Sony TV is ON");}@Overridepublic void offTV() {System.out.println("Sony TV is OFF");}@Overridepublic void channelTV() {System.out.println("Switching Sony TV channel");}
}class TCLTV implements UniversalRemoteTV{@Overridepublic void onTV() {System.out.println("TCL TV is ON");}@Overridepublic void offTV() {System.out.println("TCL TV is OFF");}@Overridepublic void channelTV() {System.out.println("Switching TCL TV channel");}
}//创建抽象类,对一个实现的引用
abstract class AbstractionTV{protected UniversalRemoteTV universalRemoteTV;public AbstractionTV(UniversalRemoteTV universalRemoteTV){this.universalRemoteTV = universalRemoteTV;}abstract void performOperation();}//创建扩充抽象化类
//打开电视操作
class PowerOperation extends AbstractionTV {public PowerOperation(UniversalRemoteTV universalRemoteTV) {super(universalRemoteTV);}@Overridevoid performOperation() {universalRemoteTV.onTV();}
}
//关闭电视操作
class OffOperation extends AbstractionTV {public OffOperation(UniversalRemoteTV universalRemoteTV) {super(universalRemoteTV);}@Overridevoid performOperation() {universalRemoteTV.offTV();}
}
//切换频道操作
class ChannelOperation extends AbstractionTV {public ChannelOperation(UniversalRemoteTV universalRemoteTV) {super(universalRemoteTV);}@Overridevoid performOperation() {universalRemoteTV.channelTV();}
}

7.5.7总结

  • 桥接模式

  • 优点:方便将抽象部分和实现部分独立扩展,不需要修改另一个部分,减少系统的耦合度

  • 总结:将系统的功能分为抽象部分和实现部分,两个部分独立存在

  • 场景

    • 不希望使用继承,或者继承导致类爆炸性增长
    • 当一个类具有多个独立变化的维度时

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

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

相关文章

maxwell同步全量历史数据

CentOS安装maxwell 在上篇的基础上&#xff0c;我们实现了实时同步mysql数据到kafka。maxwell不仅可以同步实时数据&#xff0c;也可以同步全量历史数据。在这里模拟一下历史数据的场景&#xff0c;创建表结构如下&#xff0c;并写入测试数据。 CREATE TABLE user_det…

手把手教你搭建一个数据可视化看板

前言 俗话说的好&#xff0c;“字不如表&#xff0c;表不如图”、“有图有真相&#xff0c;一图胜千言”。 数据可视化就是用图的形式把基础数据直观&#xff0c;简洁的&#xff0c;高效的展示出来&#xff0c;今天为大家介绍一下如何使用葡萄城公司的嵌入式BI工具——Wyn商业…

JavaScript的Class基本语法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript是一种基于原型的语言&#xff0c;但在ES6中引入了class关…

成功解决VScode进入到内置函数中调试

主要有两个关键步骤&#xff0c; 第一步 将launch.json中的"justMyCode"设为false 可通过使用ctrlshiftP搜索lauch.json找到次文件 如果找不到的话&#xff0c;可点击debug按钮&#xff0c;然后找到点击create a launch.json file创建 创建得到的launch.json如下&am…

vue3+elementplus点击按钮使用el-image-viewer图片预览组件

1.首先确保你是全局引入&#xff0c;不是全局的需要自主引入该组件 2..vue文件中定义组件 <el-image-viewerv-if"showImagePreview":url-list"showsrcListref"hide-on-click-modalteleportedclose"closePreview"style"z-index: 3000&qu…

32单片机RTC时间接续,掉电时间保存

1、实现思路 前提&#xff1a;首先要实现RTC掉电之后时间还能继续走&#xff0c;RTC电池是必要的 说明&#xff1a;设备第一次启动需要初始化配置RTC&#xff0c;但当二次启动再重新配置RTC会导致RTC计数器置零&#xff0c;所以传统的程序流程是不行的&#xff0c;我们需要知…

2024“华数杯”(A题)|放射性废水扩散|国际大学生数学建模竞赛建模解析,小鹿学长带队指引全代码文章与思路

我是小鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 完整内容可以在文章末尾领取&#xff01; 这回带大家体验一下2024“华数杯”国际大学生数学建模竞赛呀&#xff01; 此题涉及到放射性废水从日本排放…

齿轮齿条运动相关计算(博途S7-1200PLC脉冲轴组态)

有关S7-1200PLC脉冲轴相关应用介绍请参考下面的系列文章: S7-1200PLC脉冲轴位置控制功能块 https://rxxw-control.blog.csdn.net/article/details/135299302https://rxxw-control.blog.csdn.net/article/details/135299302S7-1200脉冲轴功能块 https://rxxw-control.blog.c…

如何在 Python3 中使用变量

介绍 变量是一个重要的编程概念&#xff0c;值得掌握。它们本质上是在程序中用于表示值的符号。 本教程将涵盖一些变量基础知识&#xff0c;以及如何在您创建的 Python 3 程序中最好地使用它们。 理解变量 从技术角度来说&#xff0c;变量是将存储位置分配给与符号名称或标…

【JVM调优系列】如何导出堆内存文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子明细实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

图像处理------亮度

from PIL import Imagedef change_brightness(img: Image, level: float) -> Image:"""按照给定的亮度等级&#xff0c;改变图片的亮度"""def brightness(c: int) -> float:return 128 level (c - 128)if not -255.0 < level < 25…

leetcode234. 回文链表

题目 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;hea…

《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)

1.简介 按宏哥计划&#xff0c;本文继续介绍WebDriver关于元素定位大法&#xff0c;这篇介绍By ClassName。看到ID&#xff0c;NAME这些方法的讲解&#xff0c;小伙伴们和童鞋们应该知道&#xff0c;要做好Web自动化测试&#xff0c;最好是需要了解一些前端的基本知识。有了前端…

养成密码管理习惯,保障个人数字安全

在当今数字时代&#xff0c;保障个人信息的安全已经变得至关重要。创建和维护安全、复杂的密码是防范潜在攻击者的首要步骤。密码不仅仅是数字世界的通行证&#xff0c;更是个人隐私的最后一道防线。在本文中&#xff0c;我们将深入探讨密码安全管理的重要性。 在当今数字时代…

超实用+全覆盖!17个大分类,近500款主流实用精品AI工具导航,太贴心了!总有一款适合你。

超实用全覆盖&#xff01;17个大分类&#xff0c;近500款主流实用精品AI工具导航&#xff0c;太贴心了&#xff01;总有一款适合你。 大家好&#xff01;我是老码农。 今天给大家分享的这个工具导航&#xff1a;非常棒。 那棒在哪里呢&#xff1f; 第1点&#xff1a;非常垂…

0、机器学习导论课程所用到的数据集

房价竞争 在本机器学习课程学习过程中用到的数据集。 本课程所需数据集夸克网盘下载链接:https://pan.quark.cn/s/9b4e9a1246b2 提取码:uDzP 文件描述 train.csv:训练数据集test.csv:测试数据集data_description.txt:每个列的完整描述,最初由Dean De Cock准备,但为了与这…

Leetcode23-数组能形成多少数对(2341)

1、题目 给你一个下标从 0 开始的整数数组 nums 。在一步操作中&#xff0c;你可以执行以下步骤&#xff1a; 从 nums 选出 两个 相等的 整数 从 nums 中移除这两个整数&#xff0c;形成一个 数对 请你在 nums 上多次执行此操作直到无法继续执行。 返回一个下标从 0 开始、长…

USB8814动态信号采集卡——声音振动类信号处理的理想之选!

背景介绍&#xff1a; 科技的发展在一定程度上依赖于对信号的处理&#xff0c;信号处理技术的先进性在很大程度上决定了科技发展的速度和方向。数字信号处理技术的崛起&#xff0c;彻底改变了传统的信息与信号处理方式&#xff0c;使得数据采集这一前期工作在数字系统中发挥着…

JavaScript 学习笔记(Day1)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 1 课程介绍 2 课程软件准备工作 3 JavaScript 介绍 4 变量 5 常量 6 数据类型 7 类型转换 8 实战案…