对桥接模式的理解

目录

  • 一、背景
  • 二、桥接模式的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.rhkb.cn/news/312035.html

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

相关文章

理想低通滤波器

理想低通滤波器,振铃现象是因为sinc函数,而sinc函数是因为例4.1的简单函数的傅里叶变换得到的。经过我的计算,简单函数的傅里叶反变换也得到sinc函数。这里的频率域滤波器因为是二个值的,所以类似简单函数,反变换之后得…

从C++ 14到C++ 17:理解聚合初始化是如何工作的

C 17中的扩展聚合初始化 一、引言二、C 14中的代码三、C 17中的代码四、扩展聚合初始化五、为什么代码停止编译?六、总结 一、引言 将编译器升级到C 17,某些看起来合理的代码停止了编译。这段代码没有使用任何在C 17中删除的过时特性,如std:…

03.卸载MySQL

卸载MySQL 1.Windows卸载MySQL8 停止服务 用命令停止或者在服务中停止都可以 net stop mysql(服务名字可以去服务里面看一下)控制面板卸载MySQL 卸载MySQL8.0的程序可以和其他桌面应用程序一样直接在控制面板选择卸载程序,并在程序列表中…

OpenHarmony、HarmonyOS和Harmony NEXT 《我们不一样》

1. OpenHarmony 定义与地位:OpenHarmony是鸿蒙系统的底层内核系统,集成了Linux内核和LiteOS,为各种设备提供统一的操作系统解决方案。 开源与商用:OpenHarmony是一个开源项目,允许开发者自由访问和使用其源代码&#…

基于afx透明视频的视觉增强前端方案

作者 | 青玉 导读 本文介绍了增长前端团队自研的Webview框架下透明视频视觉增强方案,该方案在保证对视觉进行高度还原的同时可投入更少的开发成本,还能获得更优的前端性能表现。文章首先分析了市面上动画方案的优缺点,然后详细介绍了透明视频…

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛,它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来,这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…

agi入门-大模型开发基础

AGI(Artifical General Inteligence)的到来还有多久? 乐观预测:明年主流预测:3-5年悲观预测:10年 AGI时代,AI无处不在,相关从来者将如何分? AI使用者:使用别人开发的AI产品AI产品…

中国人工智能产业年会智能交通与自动驾驶专题全景扫描

中国人工智能产业年会(CAIIAC)是中国人工智能技术发展和应用的重要展示平台,不仅关注创新,还涵盖了市场和监管方面的内容,对于促进人工智能领域的发展起到了重要作用。年会汇集了来自学术界、工业界和政府的专家&#…

【二分查找】Leetcode 74. 搜索二维矩阵【中等】

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则&#xff0c…

【InternLM 实战营第二期笔记】LMDeploy 量化部署 LLMVLM实战

Huggingface与TurboMind介绍 Huggingface HuggingFace是一个高速发展的社区,包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。可以认为是一个针对深度学习模型和数据集的在线托管社区,如…

4.Labview簇、变体与类(上)

在Labview中,何为簇与变体,何为类?应该如何理解?具体有什么应用场景? 本文基于Labview软件,独到的讲解了簇与变体与类函数的使用方法和场景,从理论上讲解其数据流的底层概念,从实践上…

【学习笔记】Python大数据处理与分析——pandas数据分析

一、pandas中的对象 1、Series对象 由两个相互关联的数组(values, index)组成,前者(又称主数组)存储数据,后者存储values内每个元素对应关联的标签。 import numpy as np import pandas as pds1 pd.Series([1, 3, 5, 7])print(…

xxl-job使用自动注册节点,ip不对,如何解决????

很明显这时我们本机的ip和我们xxl-job自动注册的ip是不一致的,此时该如何处理呢???? 方法一:在配置文件中,将我们的ip固定写好。 ### xxl-job executor server-info xxl.job.executor.ip写你的…

Flink SQL

文章目录 一、Flink SQL1、sql-client准备1.1 基于yarn-session模式1.2 常用配置 2、流处理中的表2.1 动态表和持续查询2.2 将流转换成动态表2.3 用SQL持续查询2.4 将动态表转换为流 3、时间属性3.1 事件时间3.2 处理时间 4、DDL(Data Definition Language&#xff…

详解UART通信协议以及FPGA实现

文章目录 一、UART概述二、UART协议帧格式2.1 波特率2.2 奇校验ODD2.3 偶校验EVEN 三、UART接收器设计3.1 接收时序图3.2 Verilog代码3.3 仿真文件测试3.4 仿真结果3.5 上版测试 四、UART发送器设计4.1 发送时序图4.2 Verilog代码4.3 仿真文件测试4.4 仿真结果4.5 上板测试 五、…

【Web】Dest0g3 520迎新赛 题解(全)

目录 phpdest EasyPHP SimpleRCE funny_upload EasySSTI middle PharPOP ezip NodeSoEasy Really Easy SQL&easysql EzSerial ljctr phpdest 尝试打pearcmd,但似乎没有写文件的权限 ?config-create/&file/usr/local/lib/php/pearcmd.php&a…

从零开始写 Docker(十一)---实现 mydocker exec 进入容器内部

本文为从零开始写 Docker 系列第十一篇,实现类似 docker exec 的功能,使得我们能够进入到指定容器内部。 完整代码见:https://github.com/lixd/mydocker 欢迎 Star 推荐阅读以下文章对 docker 基本实现有一个大致认识: 核心原理&…

STM32 F103 C8T6开发笔记14:与HLK-LD303-24G测距雷达通信

今日尝试配通STM32 F103 ZET6与HLK-LD303-24G测距雷达的串口通信解码 文章提供测试代码...... 目录 HLK-LD303-24G测距雷达外观: 线路连接准备: 定时器与串口配置准备: 定时器2的初始化: 串口1、2初始化: 串口1、2自定…

C++从入门到精通——类和对象(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…

Web3.0与AI的交融:开启智能互联网新时代

目前有140 多个 Web3 AI 概念项目,覆盖了基础设施、数据、预测市场、计算与算力、教育、DeFi & 跨链、安全、NFT & 游戏 & 元宇宙、搜索引擎、社交 & 创作者经济、AI 聊天机器人、DID & 消息传递、治理、医疗、交易机器人等诸多方向。持续关注…