介绍
桥接模式(Bridge Pattern)是一种结构型设计模式,旨在将抽象部分和实现部分分离,使它们能够独立地变化。桥接模式通过将抽象和实现分离,使它们可以独立进行扩展,且可以在运行时动态地组合不同的抽象部分和实现部分。
桥接模式的核心思想是将一个系统中的多个维度(抽象部分和实现部分)进行解耦。通常情况下,如果有多个维度在多个层次上变化,使用继承将导致类的爆炸性增长。而桥接模式通过将这些维度分离,将其抽象为独立的类层次结构,并使用组合关系将它们连接起来,从而避免了类的爆炸性增长。
模式角色
(1) 抽象(Abstraction)角色
接口或抽象类。定义抽象部分的接口,该类或子类维护一个指向实现部分的引用。通常抽象部分定义高层的操作,它基于实现部分进行组合,但不直接依赖于具体的实现。
(2) 扩展抽象(Refined Abstraction)角色
抽象部分的具体实现,该类一般是对抽象部分的方法进行完善和扩展。
(3) 实现(Implementor)角色
接口或抽象类。定义实现部分的接口,提供基本操作的抽象定义。这个接口不必完全和抽象部分的接口一致,实现部分提供的操作是抽象部分的基本构建块。
(4) 具体实现(Concrete Implementor)角色
实现Implementor中的接口。
注:这里的抽象部分或实现部分是根据具体业务决定的,而不是指接口类或接口的实现类。
代码示例
package com.structural;
/**
* 桥接模式示例,本例中的Shape和Color之间就是通过桥接模式联系的
*/
public class BridgePattern {
// 通过组合关系将实现部分和抽象部分联系到一起
// 其中形状为抽象部分,颜色为实现部分
public static void main(String[] args) {
// 画一个红色的圈
Shape redCircle = new Circle(new RedColor());
redCircle.draw();
Shape blueCircle = new Circle(new BlueColor());
blueCircle.draw();
}
}
/**
* 定义抽象部分的接口(Abstraction)
*/
abstract class Shape {
Color mColor ;
abstract void draw();
}
/**
* 定义实现部分的接口(Implementor)
*/
abstract class Color {
abstract void applyColor();
}
/**
* 创建具体的抽象部分(Refined Abstraction)
*/
class Circle extends Shape {
public Circle(Color color) {
mColor = color;
}
@Override
public void draw() {
System.out.print("Drawing Circle with ");
mColor.applyColor();
}
}
/**
* 创建具体的实现部分(Concrete Implementor)
*/
class RedColor extends Color {
@Override
public void applyColor() {
System.out.println("Red Color");
}
}
class BlueColor extends Color {
@Override
public void applyColor() {
System.out.println("Blue Color");
}
}
应用场景
(1) 当系统中存在多个维度的变化时
桥接模式适用于处理系统中存在多个维度的变化,并且每个维度都可以独立地变化。通过桥接模式,可以将抽象部分与实现部分分离,使得它们可以独立地变化。
(2) 当需要在抽象部分和实现部分之间建立稳定的关联关系
桥接模式适用于在抽象部分和实现部分之间建立稳定的关联关系,并且可以动态地扩展和切换关联。这样可以使得抽象部分和实现部分可以独立地进行变化,互不影响。
(3) 当需要跨越多个层次进行设计
桥接模式适用于需要在多个层次上进行设计的场景。通过桥接模式,可以将复杂的系统划分为多个层次,每个层次都可以通过桥接模式进行设计和实现。
(4) 当需要抽象和实现可以独立地进行扩展
桥接模式适用于需要抽象和实现可以独立地进行扩展的场景。通过桥接模式,可以通过扩展抽象部分和实现部分的子类来实现新的功能,而不需要修改已有的类。
(5) 当需要动态切换抽象和实现的关系
桥接模式适用于需要动态切换抽象和实现的关系的场景。通过桥接模式,可以在运行时动态地切换抽象部分和实现部分的关联,以满足不同的需求和变化。
优缺点
(1) 优点
- 分离抽象和实现,使得它们可以独立地变化,增强了系统的灵活性;
- 对客户端隐藏了抽象部分的实现细节,使得客户端可以通过抽象部分进行操作,而不需要关心具体的实现;
- 可以在运行时动态地组合不同的抽象部分和实现部分,实现灵活的组合。
(2) 缺点
- 增加了系统的复杂性,因为需要定义额外的抽象层次和实现层次;
- 不容易设计,对开发者来说要把握住抽象与实现的分离。
Android中应用-Window
Android的Framework源码中,Window机制中Window类和WindowManager类就是通过桥接模式联系的。
- Window(Abstraction):抽象部分的抽象接口,并包含一个指向WindowManager的引用;
- PhoneWindow(Refined Abstraction):是抽象部分(Window)具体的实现及扩展;
- WindowManager(Implementor):实现部分的基类,包含了addView()等方法;
- WindowManagerlmpl(Concrete Implementor):实现部分具体的逻辑实现。
另外WindowManagerlmpl也是通过桥接模式将部分功能委托给WindowManagerGlobal实现,最后由WindowManagerGlobal调用到WMS。
其它应用
(1) View
View的视图层级中,CheckBox、CompoundButton、Button、TextView和View之间构成一个继承关系的视图层级,每一层视图都仅仅是对一种类型控件的描述,其定义了该类控件所拥有的基本属性和行为,但是将它们真正绘制到屏幕的部分是由与View相关的功能实现类DisplayList、HardwareLayer和Canvas负责。 这两部分之间的关系可以看作是对桥接模式的应用。
(2) Adapter与AdapterView