定义

桥接模式是将抽象部分与它的实现部分分离, 使他们都可以独立地变化, 它是一种对象结构型模式, 又称为柄体(Handle and Body)模式或接口(Interface)模式。
6.桥接模式 - 图1

分析:**
这个场景中有两个变化的维度: 品牌—— 类型
6.桥接模式 - 图2

优缺点

优点:

  • 实现了抽象和实现部分的分离:桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统;
  • 更好的可扩展性 :抽象部分和实现部分可以分别独立扩展,而不会相互影响,大大的提供了系统的可扩展性;
  • 可动态切换实现 : 由于桥接模式实现了抽象和实现的分离,所以在实现桥接模式时,就可以实现动态的选择和使用具体的实现。

    缺点:

  • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。

    适用场景

  1. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展;
  2. 不希望或不适用使用继承的场景,可以考虑用桥接模式
  3. 接口或抽象类不稳定的场景,可以考虑用桥接模式
  4. 重用性要求较高的场景,可以考虑用桥接模式

应用实例
(1)开关。我们可以看到的开关是抽象的,不用管里面具体怎么实现;
(2)手机品牌与手机软件。两者间有一条聚合线,一个手机品牌可以有多个手机软件。
不要一涉及继承就考虑该模式,尽可能把变化的因素封装到最细、最小的逻辑单元中,避免风险扩散

桥接模式实现方法

6.桥接模式 - 图3
Brand 品牌

  1. //品牌
  2. public interface Brand {
  3. void info();
  4. }

Lenovo/Apple/Daire

  1. //联想品牌
  2. public class Lenovo implements Brand {
  3. @Override
  4. public void info() {
  5. System.out.print("联想");
  6. }
  7. }
  8. -------------------------------------------
  9. //苹果品牌
  10. public class Apple implements Brand {
  11. @Override
  12. public void info() {
  13. System.out.print("苹果");
  14. }
  15. }
  16. -------------------------------------------
  17. //戴尔品牌
  18. public class Apple implements Brand {
  19. @Override
  20. public void info() {
  21. System.out.print("戴尔");
  22. }
  23. }

Computer 电脑

  1. //抽象的电脑类型类
  2. public abstract class Computer {
  3. //组合,品牌~
  4. protected Brand brand;
  5. public Computer(Brand brand) {
  6. this.brand = brand;
  7. }
  8. public void info() {
  9. brand.info();//自带品牌
  10. }
  11. }
  12. -------------------------------------------------
  13. class Desktop extends Computer {
  14. public Desktop(Brand brand) {
  15. super(brand);
  16. }
  17. @Override
  18. public void info() {
  19. super.info();
  20. System.out.print("台式机");
  21. }
  22. }
  23. -------------------------------------------------
  24. class Laptop extends Computer {
  25. public Laptop(Brand brand) {
  26. super(brand);
  27. }
  28. @Override
  29. public void info() {
  30. super.info();
  31. System.out.print("笔记本");
  32. }
  33. }
  34. ------------------------------------------------
  35. class Pad extends Computer {
  36. public Laptop(Brand brand) {
  37. super(brand);
  38. }
  39. @Override
  40. public void info() {
  41. super.info();
  42. System.out.print("平板");
  43. }
  44. }

测试

  1. public class Test {
  2. public static void main(String[] args) {
  3. //苹果管记本
  4. Computer computer = new Laptop(new Apple());
  5. computer.info();
  6. System.out.println();
  7. //联想台式机
  8. Computer computer2 = new Desktop(new Lenovo());
  9. computer2.info();
  10. }
  11. }

JDBC中的桥接模式

使用JCBC的时候,一直很困惑获取connection的过程和原理,为什么把不同的数据库驱动名称放到Class.forName()中就能获取到对应的数据库连接呢?
6.桥接模式 - 图4
6.桥接模式 - 图5
Oracle为例,通过Class.forName(“oracle.jdbc.OracleDriver”)类加载的时候执行静态代码块将Driver注册到DriverManager,DriverManager是个Driver容器,管理不同的Driver,这样具体的数据Driver实现就统一交给容器管理,客户端通过DriverManager执行验证连接,获取连接的操作。