一,什么是桥接模式
Bridge 模式 又叫桥接模式,是构造型的设计模式之一。 Bridge 模式 基于 类的最小设计原则,通过封装,聚合以及继承等行为来让不同的类承担不同的责任, 它的主要特点是把抽象 与行为 实现 分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。
二,桥接模式的结构
桥接(Bridge) 模式包含以下主要角色
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
优点:
- 由于抽象与实现分离,所以扩展能力强;
- 其实现细节对客户透明。
缺点: 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
三,代码实现
定义实现化角色的接口,供扩展抽象化角色调用。
/**
* @Description: 抽象的接口,负责 抽象的一些行为
* @param:
* @return:
**/
public interface Engine {
/**
* 安装发动机
*/
public void installEngine();
}
给出实现化角色接口的具体实现。
public class Engine2000 implements Engine{
@Override
public void installEngine() {
System.out.println("安装2000cc发动机");
}
}
public class Engine2200 implements Engine{
@Override
public void installEngine() {
System.out.println("安装2200cc发动机");
}
}
抽象类,并包含一个对实现化对象的引用。做桥接,使拥有同样的接口,不同的引用
public abstract class Car implements Engine{
protected Engine engine;
public Car(Engine engine) {
this.engine = engine;
}
@Override
public abstract void installEngine();
}
抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
public class Bus extends Car{
public Bus(Engine engine) {
super(engine);
}
@Override
public void installEngine() {
System.out.println("给Bus装上:");
engine.installEngine();
}
}
public class Jeep extends Car {
public Jeep(Engine engine) {
super(engine);
}
@Override
public void installEngine() {
System.out.println("给Jeep装上:");
engine.installEngine();
}
}
测试:
public class MainClass {
public static void main(String[] args) {
/* Implementor imple = new ConcreteImplementorA();
Abstraction abs = new RefinedAbstraction(imple);
abs.Operation();*/
//具体的实现
Engine engine = new Engine2000();
Car car = new Bus(engine);
car.installEngine();
Engine engine1 = new Engine2200();
Car car1 = new Jeep(engine1);
car1.installEngine();
}
}
四,桥接模式的应用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。
五,桥接模式的扩展
有时桥接(Bridge)模式可与适配器模式联合使用。当桥接(Bridge)模式的实现化角色的接口与现有类的接口不一致时,可以在二者中间定义一个适配器将二者连接起来