它是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
在桥接模式中,抽象部分和实现部分都可以有多种变化,它们可以互相组合,形成更多的变化。桥接模式的实现方式是通过在抽象部分和实现部分之间建立一个桥梁,使得它们可以独立地变化,同时保持它们之间的联系。
场景(适用于任何需要将抽象和实现分离的场景,以及需要在运行时动态改变实现的场景)
当需要在不同的维度上扩展一个类时,可以使用桥接模式。例如,当需要在类的实现和抽象上进行扩展时,可以使用桥接模式(一个类存在两个独立变化的维度,且这两个维度都需要进行扩展);
当需要跨越多个平台或多个层次结构时,可以使用桥接模式。例如,一个具有多个不同操作系统的图形用户界面,可以使用桥接模式来实现;
当需要在抽象化和实现化之间进行解耦时,可以使用桥接模式。例如,当需要将一个抽象类和一个具体实现类分离时,可以使用桥接模式;
当需要动态改变一个系统中的部分中的实现时,可以使用桥接模式。例如,当需要在运行时动态改变一个系统中的部分实现时,可以使用桥接模式。
Java 语言通过 Java 虚拟机与操作系统的桥接实现了平台的无关性;AWT 中的 Peer 架构;JDBC 驱动程序等。
优缺点
优点:能够提高系统的可扩展性和灵活性,同时可以减少系统的耦合度。它可以将一个大的类分解成多个小的类,使得系统更加易于理解和维护。
缺点:增加额外的类和接口,增加了系统的复杂度(违背了类的单一职责原则),同时也增加了系统的开销。
以创建品牌电脑对象举例,市面上的电脑非常多,品牌有华为、苹果、联想等等,类型有台式、笔记本、平板等等。如果给每个品牌的每个类型的电脑都创建一个对象,那是十分繁琐的,那么此时可以考虑使用桥接模式来解决,给品牌和类型分别设置一个维度,再将这两个维度组合起来就得到了一个对象,这样只需要定义所有的品牌和所有的类型即可。
下面以华为和苹果作为品牌,台式和笔记本作为类型示例桥接模式的实现:
1.定义品牌
/**
* 品牌
*/
public interface Brand {
/**
* 名称
*/
String name();
}
2.定义电脑(抽象类)
/**
* 电脑
*/
public abstract class Computer {
/**
* 品牌
* 因为需要提供继承类使用,这里定义为 protected
*/
protected Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
/**
* 获取电脑名称,留给子类实现
*/
public abstract String name();
}
3.定义具体品牌
/**
* 华为
*/
public class HuaWei implements Brand {
@Override
public String name() {
return "华为";
}
}
/**
* 苹果
*/
public class Apple implements Brand {
@Override
public String name() {
return "苹果";
}
}
4.定义电脑类型
/**
* 台式
*/
public class Desktop extends Computer {
public Desktop(Brand brand) {
super(brand);
}
@Override
public String name() {
return super.brand.name() + "台式";
}
}
/**
* 笔记本
*/
public class Laptop extends Computer {
public Laptop(Brand brand) {
super(brand);
}
@Override
public String name() {
return super.brand.name() + "笔记本";
}
}
5.调用
// 苹果笔记本
Computer computer = new Laptop(new Apple());
System.out.println(computer.name());
// 华为台式机
Computer computer1 = new Desktop(new HuaWei());
System.out.println(computer1.name());
控制台输出:
这样就实现了品牌和类型的桥接。这样需要增加一个品牌时,只需要增加一个类实现 Brand 接口即可。需要增加一个类型时,只需要增加一个类继承 Computer 类即可。