定义
桥接模式,指将抽象部分与具体实现部分分离,使它们都可以独立地变化,属于结构型设计模式。
桥接模式的主要的目的是通过组合的方式建立两个类之间的联系,而不是继承,桥接模式是比多层继承更好的替代方案,桥接模式的核心在于把抽象与实现解耦。
使用场景:
- 在抽象和具体实现之间需要增加更多灵活性的场景
- 一个类存在两个(或多个)独立变化的维度,而这两个(或多个)维度都需要独立进行扩展
- 不希望使用继承,或因为多层继承导致系统类数目的激增。
通用写法
//抽象
public abstract class Abstraction {
protected IImplementor iImplementor;
public Abstraction(IImplementor iImplementor) {
this.iImplementor = iImplementor;
}
public void operationImpl(){
this.iImplementor.operationImpl();
}
}
//抽象实现
public interface IImplementor {
void operationImpl();
}
public class RefinedAbstraction extends Abstraction{
public RefinedAbstraction(IImplementor iImplementor) {
super(iImplementor);
}
@Override
public void operationImpl() {
super.operationImpl();
System.out.println("RefinedAbstraction operationImpl ...");
}
}
//具体实现
public class ConcreteImplementor implements IImplementor{
@Override
public void operationImpl() {
System.out.println("ConcreteImplementor operationImpl ...");
}
}
//具体实现
public class ConcreteImplementor2 implements IImplementor {
@Override
public void operationImpl() {
System.out.println("ConcreteImplementor2 operationImpl ...");
}
}
测试:
public static void main(String[] args) {
Abstraction abstraction = new RefinedAbstraction(new ConcreteImplementor());
abstraction.operationImpl();
}
uml类图:
举例
对于基本几何图形,有三角形,四边形等,每种集合图形有不同颜色(红色,黑色等),下面用桥接模式实现。
这里只实现(三角形和红色)
public interface Color {
public void bepaint(String shape);
}
public class Red implements Color {
@Override
public void bepaint(String shape) {
System.out.println("红色的"+shape);
}
}
public abstract class Shape {
public Color color;
public Shape(Color color) {
this.color = color;
}
public abstract void draw();
}
public class Triangle extends Shape{
public Triangle(Color color) {
super(color);
}
@Override
public void draw() {
color.bepaint("三角形");
}
}
测试:
Shape triangle = new Triangle(new Red());
triangle.draw();
优缺点
优点
- 1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
- 2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
- 3、实现细节对客户透明,可以对用户隐藏实现细节。
缺点
- 1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
- 2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。