桥接模式的定义
桥接模式的定义为:将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体模式或接口模式。
桥接模式的结构图
桥接模式中包含以下角色:
1、Abstraction(抽象类)
用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个Implementor类型的对象,并可以维护该对象。
2、RefinedAbstraction(扩充抽象类)
扩充有Abstraction定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在Abstraction中的抽象方法,可以调用父类中的Implementor对象。
3、Implementor(实现类接口)
定义实现类的接口,这个接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同,一般的讲,Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。Implementor接口仅提供基本操作,而Abstraction定义的接口可能会做更多更复杂的操作。
4、ConcreteImplementor(具体实现类)
实现Implementor接口并且具体实现它,在不同的ConcreteImplementor中提供基本操作的不同实现。
桥接模式的实例
抽象类Computer
public class Computer {
private Brand brand;
public Computer(Brand brand) {
this.brand = brand;
}
public void sale() {
brand.sale();
}
}
扩充抽象类
BookComputer
public class BookComputer extends Computer {
public BookComputer(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("笔记本在销售");
}
}
DeskComputer
public class DeskComputer extends Computer {
public DeskComputer(Brand brand) {
super(brand);
}
@Override
public void sale() {
super.sale();
System.out.println("台式机在销售");
}
}
实现类接口Brand
public interface Brand {
void sale();
}
具体实现类
ASUSBrand
public class ASUSBrand implements Brand {
@Override
public void sale() {
System.out.print("华硕品牌");
}
}
DellBrand
public class DellBrand implements Brand {
@Override
public void sale() {
System.out.print("戴尔品牌");
}
}
测试类Client
public class Client {
public static void main(String[] args) {
Computer AsusDeskComputer = new DeskComputer(new ASUSBrand());
AsusDeskComputer.sale();
Computer DellBookComputer = new BookComputer(new DellBrand());
DellBookComputer.sale();
}
}
测试结果
桥接模式的优缺点
优点
- 分离抽象接口及其实现部分。桥接模式使用对象间的关联关系解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度变化。
- 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明,可以对用户隐藏实现细节。
缺点
- 由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程,会增加系统的理解与设计难度。
- 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。