软件体系结构-桥接模式

定义

将抽象部分与它的实现部分解耦,使得两者都能够独立变化。

与适配器模式联合使用:

  • 桥接模式:用于系统的初步设计,对于存在两个独立变化维度的类可以将其分为抽象化和实现化两个角色,使它们可以分别进行变化
  • **适配器模式:**当发现系统与已有类无法协同工作时

UML类图

四个部分:

  • Abstraction(抽象类)
  • RefinedAbstraction(扩充抽象类)
  • Implementor(实现类接口)
  • ConcreteImplementor(具体实现类)

如果需要更换毛笔或配色,只需修改配置文件

代码

抽象类:

1
2
3
4
public abstract class Image{
public Filter filter;
public abstract void setFilter(Filter filter);
}

扩充抽象类:

1
2
3
4
5
6
7
8
9
10
11
12
public class JpgImage extends Image{

public JpgImage(Filter filter) {
this.filter = filter;
}

@Override
public void setFilter(Filter filter) {
this.filter = filter;
filter.filterPicture();
}
}

实现类接口:

1
2
3
public abstract class Filter {
public abstract void filterPicture();
}

具体实现类:

1
2
3
4
5
6
7
public class Sharpen extends Filter{

@Override
public void filterPicture() {
System.out.println("Sharpen");
}
}

优点

符合单一职责原则、开闭原则、合成复用原则、里氏替换原则、依赖倒转原则等

  • 分离抽象接口及其实现部分
  • 可以取代多层继承方案,极大地减少了子类的个数
  • 提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,不需要修改原有系统,符合开闭原则

缺点

  • 会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
  • 正确识别出系统中两个独立变化的维度并不是一件容易的事情

适用

  • 需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系
  • 抽象部分和实现部分可以以继承的方式独立扩展而互不影响
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展
  • 不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统