-
结构
- 桥接模式将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
- 抽象类Abstraction+扩充抽象类RefinedAbstraction+实现类接口Implementor+具体实现类ConcreteImplementor
- 其中抽象类定义了一个实现类接口类型的成员对象并维护该对象;扩充抽象类扩充由抽象类定义的接口,实现了在抽象类中声明的抽象业务方法;实现类接口声明了一些基本操作,而具体实现交给其子类完成;具体实现类具体实现了实现类接口,在不同的具体实现类中提供基本操作的不同实现。
-
适用环境
- 如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- 抽象部分和实现部分可以通过继承的方式独立扩展而互不影响,在程序运行时可以动态地将一个抽象化的对象和一个实现化子类的对象进行组合,即系统需要抽象化角色和实现化角色进行动态耦合。
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
- 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
-
实例
- 某软件公司要开发一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例如TXT、XML、PDF等格式,同时该工具需要支持多种不同的数据库类型。试使用桥接模式对其进行设计并使用java代码编程模拟实现。
-
public class Data { } public interface DataBase { public Data ExportData(); } public class DB2Impl implements DataBase { @Override public Data ExportData() { System.out.print("导出db2数据,"); return new Data(); } } public class MysqlImpl implements DataBase { @Override public Data ExportData() { System.out.print("导出mysql数据,"); return new Data(); } } public class OraclelImpl implements DataBase { @Override public Data ExportData() { System.out.print("导出oracle数据,"); return new Data(); } } public abstract class FileFormat { protected DataBase dataBase; public void setDataBase(DataBase dataBase) { this.dataBase = dataBase; } public abstract File convertData(); } public class XmlFileFormat extends FileFormat { @Override public File convertData() { Data data = dataBase.ExportData(); System.out.println("转换为xml格式文件"); return null; } } public class TxtFileFormat extends FileFormat { @Override public File convertData() { Data data = dataBase.ExportData(); System.out.println("转换为txt格式文件"); return null; } } public class PdfFileFormat extends FileFormat { @Override public File convertData() { Data data = dataBase.ExportData(); System.out.println("转换为pdf格式文件"); return null; } } public class Client { public static void main(String[] args) { DataBase dataBase = (DataBase) XMLUtils.getBean("bridgePatternImplementor"); FileFormat fileFormat = (FileFormat) XMLUtils.getBean("bridgePatternAbstractor"); fileFormat.setDataBase(dataBase); fileFormat.convertData(); } } 控制台输出: 导出db2数据,转换为pdf格式文件
<?xml version="1.0" encoding="UTF-8"?> <config> <bridgePatternImplementor>structuralPattern.bridgePattern.DB2Impl</bridgePatternImplementor> <bridgePatternAbstractor>structuralPattern.bridgePattern.PdfFileFormat</bridgePatternAbstractor> </config>