名称
桥接模式(Bridge)
意图
将抽象部分与它的实现相互分离,使他们都可以独立地变化。
动机
当一个抽象有多个实现地时候,通常由继承来协调他们。抽象类定义对该抽象的接口,而具体的子类则用不同的方式加以实现。但是此方法有时不够灵活,继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立修改、扩充和重用。
适用性
- 不希望在抽象和它的实现部分之间有一个固定的绑定关系。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- 想对用户完全隐藏抽象的实现部分。
- 在多个对象间共享实现,但是同时不希望客户知道这一点。
结构
参与者
- Abstraction
- 定义抽象类的接口
- 维护一个指向Implementor类型对象的指针(或者引用)
- RefinedAbstraction
- 扩充由Abstraction定义的接口
- Implementor
- 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
- ConcreteImplementor
- 实现Implementor接口并定义它的具体实现。
协作
Abstraction将client的请求转换为它的Implementor对象
优缺点
优点
- 分离接口以及实现部分
- 提高可扩充性
- 实现细节对客户透明
示例代码
package abc;
//这里时抽象类或者时接口
abstract class Car{
protected Color color;
//这里保存了一个指向另一个接口类型对象的引用
public void setColor(Color color){
this.color=color;
}
public abstract void getInfor();
}
//下面时抽象类的具体实现BMW和QQ两种车
class BMW extends Car{
@Override
public void getInfor(){
System.out.println("this is a "+this.color.getColor()+" BMW");
}
}
class QQ extends Car{
@Override
public void getInfor(){
System.out.println("this is a "+this.color.getColor()+" QQ");
}
}
//这里时一个抽象接口,这个接口和刚刚的抽象类就是所谓的桥
interface Color {
public String getColor();
}
class Black implements Color{
@Override
public String getColor(){
return "black";
}
}
class Red implements Color{
@Override
public String getColor(){
return "red";
}
}
class Yellow implements Color{
@Override
public String getColor(){
return "yellow";
}
}
public class Bridge{
public static void main(String[]args){
Car car1=new BMW();
car1.setColor(new Yellow());
car1.getInfor();
}
}
输出结果
this is a yellow BMW