【设计模式与体系结构】结构型模式-桥接模式
简介
桥接模式(Bridge Pattern)将抽象和实现分离,使它们可以独立变化。它是用组合关系来代替继承关系,满足合成复用原则,从而降低了抽象和实现这两个可变维度的耦合度
桥接模式的角色
- 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类方法中的业务方法,并通过组合关系调用实现化角色中的业务方法
- 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用
- 具体实现化(Concrete Implementor)角色:给出实现化角色的接口的具体实现
桥接模式的优点
- 提高系统可扩展性:在两个维度中任意扩展一个维度,都不需要修改原有系统。
- 实现细节对客户透明
- 分离抽象和实现,组合的灵活性更高
桥接模式的缺点
- 系统复杂性增大
- 对程序员的能力要求相对较高
- 性能损耗:由于是面向抽象编程,这种间接性可能会带来一定的性能损耗
桥接模式的使用场景
- 当一个类存在两个维度,且两个维度都有扩展的可能性时
- 当一个系统不希望因为继承关系,而发生类爆炸时
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系
正文
编程语言的平台移植性的概念:编程语言的平台移植性是指代码在不经过或经过少量修改的情况下,能够从一种计算平台(包括不同的操作系统、硬件架构等)转移到另一种计算平台上运行,并且保持原有功能的特性。
有些编程语言天生就具有较好的平台移植性。例如,Java 语言在设计时就考虑了平台移植性问题。它通过 Java 虚拟机(JVM)来运行程序,JVM 为 Java 程序提供了一个统一的运行环境,使得 Java 程序在不同操作系统和硬件架构上都能以相同的方式运行。而像汇编语言,由于它是直接与硬件指令集相关的,所以其平台移植性很差,一种汇编语言代码通常只能在特定的硬件架构上运行。
以不同编程语言运行在不同平台为案例,演示桥接模式的使用。
定义一个抽象平台类(只能定义为抽象类)AbstractPlatform.java
public abstract class AbstractPlatform {
protected ILanguage language;
public AbstractPlatform(ILanguage language) {
this.language = language;
}
public abstract void run();
}
定义一个抽象语言接口 ILanguage.java
public interface ILanguage {
int complie();
}
定义两个不同的平台类 Windows.java 和 Linux.java
public class Windows extends AbstractPlatform {
public Windows(ILanguage language) {
super(language);
}
@Override
public void run() {
if (language.complie() == 1) {
System.out.println("在 Windows 运行成功");
} else {
System.out.println("在 Windows 运行失败");
}
}
}
public class Linux extends AbstractPlatform {
public Linux(ILanguage language) {
super(language);
}
@Override
public void run() {
language.complie();
System.out.println("在 Linux 运行成功");
}
}
定义两个不同的语言类 CPPlanguage.java 和 AssemblyLanguage.java
public class CPPLanguage implements ILanguage {
@Override
public int complie() {
System.out.println("CPP 编译中...");
return 1;
}
}
public class AssemblyLanguage implements ILanguage {
@Override
public int complie() {
System.out.println("汇编编译中...");
return 0;
}
}
定义一个客户端类 Client.java
public class Client {
public static void main(String[] args) {
ILanguage cpp = new CPPLanguage();
ILanguage assembly = new AssemblyLanguage();
AbstractPlatform windows1 = new Windows(cpp);
windows1.run();
AbstractPlatform window2 = new Windows(assembly);
window2.run();
AbstractPlatform linux1 = new Linux(cpp);
linux1.run();
AbstractPlatform linux2 = new Linux(assembly);
linux2.run();
}
}
运行效果截图如下:

思考:为什么是要将平台定义为抽象类,而不将语言定义为抽象类?
答:因为是平台上有语言,而不是语言上有平台
浙公网安备 33010602011771号