当前位置:   article > 正文

设计模式第12讲——桥接模式(Bridge)_设计模式桥接模式

设计模式桥接模式

一、什么是桥接模式

桥接模式是一种结构型设计模式。它将抽象部分实现部分分离,使它们可以独立地变化。

二、角色组成

  • 抽象部分(Abstraction):定义了抽象部分的接口,并包含对实现部分的引用
  • 实现部分(Implementor):定义了实现部分的接口。
  • 具体抽象(Concrete Abstraction):继承抽象部分,实现其中定义的抽象方法。
  • 具体实现(Concrete Implementor):实现Implementor,实现其中定义的具体行为。

三、优缺点

优点:

  • 分离抽象和实现,使得它们可以独立变化。
  • 提高了系统的灵活性和可扩展性。
  • 隐藏了具体的实现细节,使系统更加稳定和可靠。
  • 符合开闭原则,可以方便地增加新的抽象和实现部分。

缺点:

  • 需要定义抽象部分和实现部分之间的桥接接口,增加了系统的复杂性。
  • 如果一个类有多个变化的维度,使用桥接模式可能会导致类的数量增多,增加了系统的复杂性和维护成本。

四、应用场景

4.1 生活场景

  • 墙上的开关:可以看到的开关是抽象的,不用管里面具体怎么实现的。
  • 蓝牙耳机与手机:蓝牙耳机可以连接不同品牌的手机,那么手机就可以看作是抽象部分,蓝牙耳机是实现部分,实现不同蓝牙耳机与不同手机的连接和通讯。
  • 遥控器和电视:同样道理,遥控器可以控制不同品牌的电视,遥控器可以作为抽象部分,电视则作为实现部分,实现不同遥控器与不同电视的连接和操作。

4.2 java场景

  • JdbcTemplate:用于简化数据库操作的类,它使用了桥接模式将数据库的访问方式(如JDBC、Hibernate、MyBatis)与具体的实现(Oracle、Mysql、SQL Server)分离,这样可以方便地切换不同的数据库访问方式。
  • Spring的DI和IOC:抽象部分定义了接口或抽象类。比如BeanFactory,而实现部分则由具体的实现类(XmlBeanFactory等)提供。
  • 日志框架:抽象部分定义了一组日志记录接口,并提供了不通过的日志记录方法,如DEBUG、INFO、ERROR等,实现部分则通过具体的日志实现类提供实际的日志记录功能,如Log4j、Logback等。

五、代码实现

下面是一个蓝牙耳机和手机的简单例子,用来解释桥接模式。手机作为抽象部分,蓝牙耳机作为实现部分。通过抽象类对实现类接口的引用,使手机可以调用蓝牙接口的方法,实现手机与蓝牙耳机的连接和调用的解耦。

  • 抽象部分:Phone
  • 实现部分:Bluetooth
  • 具体抽象:HWPhone、IPhone
  • 具体实现:BluetoothImpl

5.0 UML类图

5.1 实现部分——Bluetooth

  1. /**
  2. * @author Created by njy on 2023/6/15
  3. * 1.实现部分(Implementor):蓝牙接口
  4. */
  5. public interface Bluetooth {
  6. //连接
  7. void connect();
  8. //断开
  9. void disConnect();
  10. }

5.2 具体实现——BluetoothImpl

  1. /**
  2. * @author Created by njy on 2023/6/15
  3. * 2.具体实现(Concrete Implementor):实现蓝牙接口
  4. */
  5. public class BluetoothImpl implements Bluetooth{
  6. @Override
  7. public void connect() {
  8. System.out.println("蓝牙已连接!");
  9. }
  10. @Override
  11. public void disConnect() {
  12. System.out.println("蓝牙已断开!");
  13. }
  14. }

5.3 抽象部分——Phone

  1. /**
  2. * @author Created by njy on 2023/6/15
  3. * 3.抽象部分(Abstraction):手机抽象类
  4. */
  5. public abstract class Phone {
  6. //蓝牙接口实例
  7. protected Bluetooth bluetooth;
  8. public Phone(Bluetooth bluetooth){
  9. this.bluetooth=bluetooth;
  10. }
  11. //手机具体功能,调用蓝牙接口的方法
  12. public abstract void bluetoothFunction();
  13. }

5.4 具体抽象

  1. /**
  2. * @author Created by njy on 2023/6/15
  3. * 4.具体抽象:苹果手机
  4. */
  5. public class IPhone extends Phone{
  6. public IPhone(Bluetooth bluetooth) {
  7. super(bluetooth);
  8. }
  9. //手机具体功能,调用蓝牙
  10. @Override
  11. public void bluetoothFunction() {
  12. System.out.println("苹果手机使用蓝牙耳机");
  13. bluetooth.connect();
  14. bluetooth.disConnect();
  15. }
  16. }
  1. /**
  2. * @author Created by njy on 2023/6/15
  3. * 4.具体抽象:华为手机
  4. */
  5. public class HWPhone extends Phone{
  6. public HWPhone(Bluetooth bluetooth) {
  7. super(bluetooth);
  8. }
  9. //手机具体功能,调用蓝牙
  10. @Override
  11. public void bluetoothFunction() {
  12. System.out.println("华为手机使用蓝牙耳机");
  13. bluetooth.connect();
  14. bluetooth.disConnect();
  15. }
  16. }

5.5 TestBridge

  1. /**
  2. * @author Created by njy on 2023/6/15
  3. * 桥接模式测试类
  4. */
  5. @SpringBootTest
  6. public class TestBridge {
  7. @Test
  8. void testBridge(){
  9. //1 创建蓝牙耳机对象
  10. Bluetooth bluetooth=new BluetoothImpl();
  11. //2.创建不同品牌的手机对象
  12. //苹果
  13. Phone iPhone=new IPhone(bluetooth);
  14. //华为
  15. Phone hw=new HWPhone(bluetooth);
  16. //调用手机的具体功能方法
  17. iPhone.bluetoothFunction();
  18. System.out.println("=========================");
  19. hw.bluetoothFunction();
  20. }
  21. }

六、总结

  • 当一个类需要两个或多个变化维度时:桥接模式可以将这些变化维度分离出来,使它们可以独立变化。例如,在一个图形编辑器中,图形和颜色可以被视为两个变化的维度,通过使用桥接模式,可以实现不同图形和不同颜色的组合。
  • 需要实现多层继承时:使用继承会导致类层次结构的爆炸性增长,难以维护和扩展。而桥接模式通过将抽象部分和实现部分分离,使得新增功能可以通过组合来实现,而不是通过继承。
  • 需要在抽象部分和实现部分之间增加灵活性时:桥接模式允许抽象部分和实现部分可以独立变化,提供了更大的灵活性和可配置性。例如,在一个电商平台中,抽象部分可以是商品,实现部分可以是支付方式,通过桥接模式可以在运行时选择不同的支付方式。
  • 需要对抽象和实现部分进行扩展时:桥接模式允许抽象部分和实现部分可以独立扩展,而不会相互影响。例如,在一个电子设备管理系统中,抽象部分可以是设备接口,实现部分可以是不同类型的设备,通过桥接模式可以方便地添加新的设备类型。

总结:桥接模式适用于多维度变化多层继承灵活性要求高扩展性高的场景。

END:更多设计模式的介绍,推荐移步至

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/568951
推荐阅读
相关标签