1、定义
将抽象部分与实现部分分离,使他们都可以独立地变化。
2、使用场景
- 如果抽象部分和实现部分都能够扩展的情况,可以采用桥接模式让他们都独立变化,从而灵活地进行单独扩展。
- 一个类存在两个独立变化的维度,而且这两个维度都需要进行扩展。
- 任何多维度变化类或者多个树状类之间的耦合都可以使用桥接模式解耦。
3、UML图
- Abstraction:抽象部分的接口。通常需要维护一个实现部分的对象引用。抽象对象这里面的功能,需要由实现部分的对象来实际完成。
- RefinedAbstraction:扩展抽象部分的接口。
- Implementor:定义实现部分的接口。
- ConcreteImplementor:真正实现Implementor里面的接口。
4、代码示例
UML图中的实现代码不容易形象地理解,如下举一个比较形象的例子。
咖啡有大杯、小杯之分;也有加糖、不加糖之分。所有这就有两个独立变化的维度,而且这两个维度都需要扩展。
定义咖啡类:
public abstract class Coffee {
//咖啡佐料
protected CoffeeAdditive mCoffeeAdditive;
public Coffee(CoffeeAdditive coffeeAdditive) {
super();
this.mCoffeeAdditive = coffeeAdditive;
}
public abstract void makeCoffee();
}
/**
* 小杯咖啡
*/
public class SmallCoffee extends Coffee {
public SmallCoffee(CoffeeAdditive coffeeAdditive) {
super(coffeeAdditive);
}
@Override
public void makeCoffee() {
System.out.println("小杯的" + mCoffeeAdditive.addSomething() + "咖啡");
}
}
/**
* 大杯咖啡
*/
public class LargeCoffee extends Coffee {
public LargeCoffee(CoffeeAdditive coffeeAdditive) {
super(coffeeAdditive);
}
@Override
public void makeCoffee() {
System.out.println("大杯的" + mCoffeeAdditive.addSomething() + "咖啡");
}
}
咖啡佐料定义:
/**
* 原味
*/
public class Original implements CoffeeAdditive {
@Override
public String addSomething() {
return "原味";
}
}
/**
* 加糖
*/
public class Sugar implements CoffeeAdditive {
@Override
public String addSomething() {
return "加糖";
}
}
客户端调用:
public class Client {
public static void main(String args[]) {
CoffeeAdditive sugar = new Sugar();
CoffeeAdditive orignal = new Original();
//小杯加糖咖啡
Coffee smallSugarCoffee = new SmallCoffee(sugar);
smallSugarCoffee.makeCoffee();
//小杯原味咖啡
Coffee smallOriginalCoffee = new SmallCoffee(orignal);
smallOriginalCoffee.makeCoffee();
//大杯加糖咖啡
Coffee largeSugarCoffee = new LargeCoffee(sugar);
largeSugarCoffee.makeCoffee();
//小杯原味咖啡
Coffee largeOriginalCoffee = new LargeCoffee(orignal);
largeOriginalCoffee.makeCoffee();
}
}
调用结果:
Coffee类对应与UML图中的抽象部分,CoffeeAdditive对应于实现部分。模式中的抽象和实现实质上对应的是两个独立变化的维度。