对桥接模式的理解

目录

  • 一、背景
  • 二、桥接模式的demo
    • 1、类型A(形状类型)
    • 2、类型B(颜色类型)
    • 3、需求:类型A要使用类型B(如:红色的方形)
    • 4、Spring的方式

一、背景

  • 在《对装饰器模式的理解》中,当我们想基于某个类做扩展时,我们不是采用继承而是组合的方式。这样,可以避免子类爆炸的问题。
    • 想象一下俄罗斯套娃,类与类之间的结果也类似。
  • 还有一种场景:
    在这里插入图片描述
    • 如果采用继承的方式,例如,类型AB1、类型AB2等,也会导致子类爆炸。
    • 那怎么解决呢? --> 依然是组合

二、桥接模式的demo

1、类型A(形状类型)

public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("circle");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("square");}
}

2、类型B(颜色类型)

public interface Color {void fill();
}public class RedColor implements Color {@Overridepublic String fill() {return "red";}
}public class BlueColor implements Color {@Overridepublic String fill() {return "blue";}
}

3、需求:类型A要使用类型B(如:红色的方形)

  • 将类型A和类型B桥接起来。(本质上就是组合)

装饰器模式,是同一接口(同一抽象)的组合。
桥接模式,是不同接口(不同抽象)的组合。

  • 实现:
public class Circle implements Shape {private Color color;public Circle(Color color) {this.color = color;}@Overridepublic void draw() {System.out.println(color.fill() + " circle");}
}public class Square implements Shape {private Color color;public Square(Color color) {this.color = color;}@Overridepublic void draw() {
//        System.out.println("square");System.out.println(color.fill() + " square");}
}
public class Application {public static void main(String[] args) {Shape redCircle = new Circle(new RedColor());redCircle.draw();Shape blueCircle = new Circle(new BlueColor());blueCircle.draw();System.out.println("-------------------------------");Square redSquare = new Square(new RedColor());redSquare.draw();Square blueSquare = new Square(new BlueColor());blueSquare.draw();}
}

4、Spring的方式

实际开发中,我们希望Spring帮我们组织好bean,我们拿来就用即可。

@Configuration
public class ShapeConfig {@Beanpublic Color blueColor() {return new BlueColor();}@Beanpublic Color redColor() {return new RedColor();}@Beanpublic Square blueSquare(@Qualifier("blueColor") Color blueColor) {return new Square(blueColor);}@Beanpublic Square redSquare(@Qualifier("redColor") Color redColor) {return new Square(redColor);}@Beanpublic Circle blueCircle(@Qualifier("blueColor") Color blueColor) {return new Circle(blueColor);}@Beanpublic Circle redCircle(@Qualifier("redColor") Color redColor) {return new Circle(redColor);}
}
@ComponentScan
public class Application {public static void main(String[] args) {AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Application.class);Circle blueCircle = applicationContext.getBean("blueCircle", Circle.class);blueCircle.draw();Circle redCircle = applicationContext.getBean("redCircle", Circle.class);redCircle.draw();System.out.println("--------------------------------------------------------------------------------");Square blueSquare = applicationContext.getBean("blueSquare", Square.class);blueSquare.draw();Square redSquare = applicationContext.getBean("redSquare", Square.class);redSquare.draw();applicationContext.close();}
}

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

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

相关文章

“手撕“数组一些简单的习题

目录 1.数组转字符串 2.数组拷贝 3.求数组中元素的平均值 4.查找数组中指定元素(顺序查找) 5.查找数组中指定元素(二分查找) 6.数组排序(冒泡排序) 7.数组逆序 1.数组转字符串 先让我们看看为什么要转字符串: int[] arr {1,2,3,4,5,6}; System.out.printl…

实验案例二:配置路由器实现互通

一.实验环境 实验用具包括两台路由器(或交换机).一根双绞线缆,一台PC,一条Console线缆。 二.需求描述 如图6.14所示,将两台路由器的Gig0/0接口相连,通过一台PC连接设备的Console端口并配置IP地址&#x…

分享一个纯HTML外贸公司通用企业html网站模板源码

纯HTML外贸公司通用企业html网站模板源码 源码地址:https://download.csdn.net/download/Highning0007/89150720

Jenkins用maven风格build报错解决过程记录

1、Jenkins2.453新建项目,构建风格选的maven 2、自由风格构建部署没有任何问题,但是maven风格build一直失败,报错如下图 3、解决方案:在系统管理–系统配置–Maven项目配置,删除全局MAVEN_OPT的路径信息,…

2.4G漂移小车电子方案 酷得智能科技

漂移高速遥控车是一种专门设计用于执行高速漂移动作的遥控车模型。以下是一些关于漂移高速遥控车的功能介绍: 1、高速性能:漂移车通常配备有强力的电机和电池,以便在保持高速的同时进行漂移动作。 2、漂移能力:漂移车的轮胎和悬挂…

Samtec应用分享 | 汽车应用中的视觉系统

【前言】 视觉系统在未来的汽车设计中扮演着关键的角色。 在过去,一直是由驾驶员掌握和应对道路上的危险,但现代车辆在保障驾驶安全方面发挥着前所未有的作用。 视觉系统,无论是可见光摄像头还是先进的探测系统,如激光雷达&…

【Java】通过poi给word首页添加水印图片

背景: poi并没有提供直接插入水印图片的方法,目前需要再word的首页插入一张水印图片,于是就需要通过另一种方式,插入透明图片(png格式)并将图片设置为“浮于文字上方”的方式实现该需求。 所需jar&#xf…

使用python采集VIP会电商平台商品数据②单页数据采集

获取标头: 响应:服务器返回的数据 预览:查看响应得数据 载荷:查询参数/请求参数 标头:查看请求的网址/请求的标头/请求方法 数据包地址:https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/mo…

Servlet-Filter实现反爬虫

以前用DotNetCore实现过反爬虫功能。在tomcat里面可以利用Servlet的Filter类实现请求的控制来达到反爬虫功能,进而增强JRT的web安全。 实现黑名单过滤器,对在黑名单列表的IP的所有请求都跳转到警告页面,业务各种请求自行定义加入黑名单 /* …

Yolo-world+Python-OpenCV之摄像头视频实时目标检测

上一次介绍了如何使用最基本的 Yolo-word来做检测,现在我们在加opencv来做个实时检测的例子 基本思路 1、读取离线视频流 2、将视频帧给yolo识别 3、根据识别结果 对视频进行绘制边框、加文字之类的 完整代码如下: import datetimefrom ultralytics …

电竞陪玩系统开发平台搭建(小程序,公众号,app)线上线下皆有,线下计算距离。

六大核心功能 1.游戏陪练:可以选择当下火爆的游戏内容,选择游戏大神、职业玩家进行陪练,也可约附近路人玩家或是身边的小伙伴语音组队开黑,一起享受边玩游戏边吐槽的无限乐趣。 2.约玩交友:除了游戏陪玩功能,系统还设置了单独的语…

SpringBlade dict-biz/list SQL 注入漏洞复现

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

Python LEGB规则

Python在查找“名称”时,是按照LEGB规则查找的: Local: 指的就是函数或者类的方法内部 Enclosed: 指的是嵌套函数(一个函数包裹另一个函数,闭包) Global: 指的是模块中的全局变量 Bu…

含多种需求响应及电动汽车的微网/虚拟电厂日前优化调度

1 主要内容 程序主要建立一个微网/虚拟电厂的日前优化调度模型,以燃气轮机运行成本、购售电费用、电动汽车电池损耗成本以及需求响应费用之和为目标,在日前经济调度模型中,加入了电动汽车模型,考虑了电动汽车出行规律以及充放电规…

python之flask安装以及使用

1 flask介绍 Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。 2 python…

超越GPT-4V,苹果多模态大模型上新,神经网络形态加速MLLM(一)

4月8日,苹果发布了其最新的多模态大语言模型(MLLM )——Ferret-UI,能够更有效地理解和与屏幕信息进行交互,在所有基本UI任务上都超过了GPT-4V! 苹果开发的多模态模型Ferret-UI增强了对屏幕的理解和交互&am…

【触想智能】如何选购到一款合适的工业电脑一体机

工业电脑一体机是专为工业环境而设计的一种工业计算机。工业电脑一体机和普通的计算机不一样,它对产品的参数性能要求很高,因为它们通常会运行在高低温、电磁干扰、高粉尘、湿度大的恶劣环境中,所以相应的要求工业电脑一体机必须具备良好的宽…

UE5下载与安装

官方网站:https://www.unrealengine.com/zh-CN 1、下载启动程序安装包。 登录官网后,点击首页右侧下载按钮下载Epic Games启动程序的安装包,如下图: 2、安装启动程序。 双击步骤1所下载安装软件,如下图:…

vivado AXI 接口事件

AXI 接口事件 在 Vivado 硬件管理器中 , 如果使用 System ILA IP 对设计 AXI 接口进行调试 , 那么“波形 (Waveform) ”窗口会显示对 应于 System ILA 所探测的接口的接口插槽、事件和信号组。正如下图所示 , “ Waveform ”窗口会显示…

中立分析腾讯云故障相关的事件

最近腾讯云的故障,让一堆云计算爱好者兴奋地远看指点江山、近看沐猴而冠。我比这群爱好者们更了解云计算,但是我尊重我的读者,你们从我这里看到的科普信息,不仅仅只有情绪价值。 在信息爆炸的时代,大家关注和信任某个媒…