一、模式动机
桥接模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”
二、模式定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
三、模式结构
原始结构
解耦变化
我们需要解耦这两个方向的变化,把它们之间的强耦合关系改成弱联系。我们把手机品牌和手机软件的实现分别当作两个独立的部分来对待。解耦结构
Bridge使用了对象聚合的方式,像一座桥通用结构
在桥接模式中不仅Implementor具有变化(ConcreateImplementior),而且Abstraction也可以发生变化(RefinedAbstraction),这是一个多对多的关系,而且两者的变化是完全独立的。RefinedAbstraction与ConcreateImplementior之间松散耦合,它们仅仅通过Abstraction与Implementor之间的聚合关系联系起来。
四、参与者
- Abstraction:抽象类
- RefinedAbstraction:扩充抽象类
- Implementor:实现类接口
- ConcreteImplementor:具体实现类
五、示例代码
package design.pattern;
// 手机软件
abstract class MobilePhoneSoft {
public abstract void run();
}
// 手机游戏
class MobilePhoneGame extends MobilePhoneSoft {
public void run() {
System.out.println("运行手机游戏");
}
}
// 手机音乐播放器
class MobilePhoneMusic extends MobilePhoneSoft {
public void run() {
System.out.println("运行音乐软件");
}
}
// 手机品牌
abstract class MobilePhoneBrand {
protected MobilePhoneSoft soft;
public void setSoft(MobilePhoneSoft soft) {
this.soft = soft;
}
public abstract void run();
}
// 手机品牌N
class MobilePhoneN extends MobilePhoneBrand {
public void run() {
soft.run();
}
}
public class Bridge {
public static void main(String[] args) {
MobilePhoneBrand pb = new MobilePhoneN();
pb.setSoft(new MobilePhoneGame());
pb.run();
pb.setSoft(new MobilePhoneMusic());
pb.run();
}
}
模式结构
优点
- 分离接口及其实现部分
- 桥接模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。 所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,从而获得不同平台上的不同型号。
- 桥接模式提高了系统的可扩充性。
- 桥接模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用桥接模式。
- 实现细节对客户透明,可以对用户隐藏实现细节。
- 桥接模式是比多继承方案更好的解决方法。
- 桥接模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。
- 分离接口及其实现部分
模式使用
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性, 避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
- 一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
- 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
模式应用
- Java虚拟机
- Java虚拟机