对桥接模式的理解

news/2025/2/11 21:26:19/

目录

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

一、背景

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

二、桥接模式的demo

1、类型A(形状类型)

java">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(颜色类型)

java">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桥接起来。(本质上就是组合)

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

  • 实现:
java">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");}
}
java">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,我们拿来就用即可。

java">@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);}
}
java">@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.ppmy.cn/news/1429987.html

相关文章

11-4.Vue2.x基本列表—列表更新—push

文章目录 列表更新数组更新检测 列表更新 数组更新检测 变更方法 Vue 将被侦听的数组的变更方法进行了包裹&#xff0c;所以它们也将会触发视图更新。这些被包裹过的方法包括&#xff1a; push() pop() shift() unshift() splice() sort() reverse()<!DOCTYPE html> &…

flutter 谷歌的苹果系统消息推送

flutter firebase 云消息通知教程 (android-安卓、ios-苹果) Android、ReactNative、Flutter集成Firebase推送注意事项 Android&#xff1a;Firebase 凭据 iOS&#xff1a;基于 p8 令牌的 APN 连接 iOS&#xff1a;p12 生成证书 Flutter之对接国外推送onesignal踩坑笔记&a…

基于贝叶斯算法的机器学习在自动驾驶路径规划中的应用实例

目录 第一章 引言 第二章 数据准备 第三章 贝叶斯路径规划模型训练 第四章 路径规划预测 第五章 路径执行 第六章 实验结果分析 第一章 引言 自动驾驶技术的发展带来了自动驾驶车辆的出现&#xff0c;而路径规划作为自动驾驶车辆的关键功能之一&#xff0c;对于确定最佳行…

halcon 3.2标定相机

参考《solution_guide_iii_c_3d_vision.pdf》 3.2.2.2 Which Distortion Model to Use 选用何种畸变模型 对于面阵相机&#xff0c;halcon中两种畸变模型&#xff1a;The division model and the polynomial model&#xff08;差分模型和多项式模型&#xff09;&#xff0c;前…

算法思想总结:栈

一、栈的经典应用&#xff1a;波兰表达式与逆波兰表达式 我们平时看到的 12*&#xff08;3-4*5&#xff09;6/7 叫做中缀表达式&#xff0c;平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级&#xff0c;但是计算机并不一定知道…

学习部分排序,插入排序,冒泡排序以及希尔排序

1.插入排序 <1>.首先我们举个例子 我们要把6进行前面的插入&#xff0c;那我们要进行比较&#xff0c;首先确定一个end的指针&#xff0c;然后他指向的数字就是我们需要比较的&#xff0c;如果end指向的数比我们end1 的大的话&#xff0c;那我们就往前挪一个&#xff0c…

JAVA学习笔记29(集合)

1.集合 ​ *集合分为&#xff1a;单列集合、双列集合 ​ *Collection 接口有两个重要子接口 List Set&#xff0c;实现子类为单列集合 ​ *Map接口实现子类为双列集合&#xff0c;存放的King–Value ​ *集合体系图 1.1 Collection接口 1.接口实现类特点 1.collection实现…

详细说一下索引和性能优化

当我们谈到数据库性能优化时&#xff0c;索引是一个非常重要的篇章。数据库索引是一个数据结构&#xff0c;它可以帮助数据库系统更快地查找数据。 什么是索引&#xff1a; 数据库索引是一种特殊的数据结构&#xff0c;它可以提高数据库查询的速度。可以简单地将数据库索引理解…