定义
将抽象和实现解耦,是两者可以独立变化
抽象定义了要做什么,而实现定义了如何去做。如果是继承结构,抽象发生变化时需修改抽象方法,违背了开闭原则。而桥接模式由于分离了抽象和实现,使得抽象方法可以通过拓展抽象来实现拓展
结构和实现
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
实现
public class BridgeTest
{
public static void main(String[] args)
{
Implementor imple=new ConcreteImplementorA();
Abstraction abs=new RefinedAbstraction(imple);
abs.Operation();
}
}
//实现化角色
interface Implementor
{
public void OperationImpl();
}
//具体实现化角色
class ConcreteImplementorA implements Implementor
{
public void OperationImpl()
{
System.out.println("具体实现化(Concrete Implementor)角色被访问" );
}
}
//抽象化角色
abstract class Abstraction
{
protected Implementor imple;
protected Abstraction(Implementor imple)
{
this.imple=imple;
}
public abstract void Operation();
}
//扩展抽象化角色
class RefinedAbstraction extends Abstraction
{
protected RefinedAbstraction(Implementor imple)
{
super(imple);
}
public void Operation()
{
System.out.println("扩展抽象化(Refined Abstraction)角色被访问" );
imple.OperationImpl();
}
}
与传统继承结构的比较
继承结构
桥接模式
两者相比较,我们能够发现在继承结构中一旦抽象发生变更,由于继承的强侵入性,子类势必要全部发生修改。但是在桥接模式中,由于分离了抽象与实现,一旦需求变更,我们完全可以通过继承原来的抽象来完成抽象拓展,同时由于是聚合实现类,因此在继承结构中需要变更的子类可以通过拓展新的实现类来完成拓展,原有的抽象和实现并不会发生变化
总结
优点
- 抽象与实现分离,扩展能力强
- 符合开闭原则
- 符合合成复用原则
- 其实现细节对客户透明
使用场景
- 不希望使用继承结构
- 抽象不稳定
- 重用性要求高
拓展
在软件开发中,有时桥接(Bridge)模式可与适配器模式联合使用。当桥接(Bridge)模式的实现化角色的接口与现有类的接口不一致时,可以在二者中间定义一个适配器将二者连接起来,其具体结构图如图