桥接模式概述
在画图工具中,有各种不同类型的画笔,也有不同类型的颜色,可以用铅笔画黑色或红色,也可以用钢笔画黑色或红色,其实这个操作背后的设计模式就是桥接模式。如果不适用桥接模式,画4种不同颜色和类型的线,就需要4种比,如果颜色和画笔的种类更多,需要的画笔会指数级增长,这个时候,就需要有桥接模式了。
示例:
有一个数据转换工具,可以将数据库中的数据转换成多种文件格式,例如txt、xml、pdf等格式,同时该工具需要支持多种不同的数据库。试使用桥接模式对其进行设计。
UML图
示例解析
在该示例中,有两个独立变化的维度,分别是数据库类型和待转换的文件类型。ExactData是数据库读取数据后解析之后的数据,不同的数据库通过实现ExactDataImpl接口解析具体数据,抽象类AbstractFile持有ExactDataImpl对象,获取解析的数据,提供一个抽象的convetTo方法由子类实现。具体的文件类继承AbstractFile在convertTo进行数据的转换处理。
示例代码
数据库读取数据维度
public class ExactData {
//忽略内容
}
//数据解析接口
public interface ExactDataImpl {
ExactData readFromDB( );
}
//具体数据库读取接口
public class MySQLImpl implements ExactDataImpl {
@Override
public ExactData readFromDB() {
System.out.println("MySQL数据读取");
return new ExactData();
}
}
//具体数据库读取并解析数据
public class OracleImpl implements ExactDataImpl {
@Override
public ExactData readFromDB() {
System.out.println("Oracle数据读取");
return new ExactData();
}
}
//具体数据库读取并解析数据
public class DB2Impl implements ExactDataImpl {
@Override
public ExactData readFromDB() {
System.out.println("DB2数据读取");
return new ExactData();
}
}
文件生成维度
//文件生成抽象类
public abstract class AbstractFile {
protected ExactDataImpl exactDataImpl;
public void setExactDataImpl(ExactDataImpl exactDataImpl){
this.exactDataImpl = exactDataImpl;
}
public abstract void convertTo( );
}
//具体文件生成类
public class PDFFile extends AbstractFile {
@Override
public void convertTo() {
ExactData exactData = exactDataImpl.readFromDB();
System.out.println("转换为PDF文件");
}
}
//具体文件生成类
public class TXTFile extends AbstractFile {
@Override
public void convertTo() {
ExactData exactData = exactDataImpl.readFromDB();
System.out.println("转为TXT文件");
}
}
//具体文件生成类
public class XMLFile extends AbstractFile {
@Override
public void convertTo() {
ExactData exactData = exactDataImpl.readFromDB();
System.out.println("转换为XML文件");
}
}
调用
AbstractFile abstractFile = new TXTFile();
ExactDataImpl exactDataImpl = new MySQLImpl();
abstractFile.setExactDataImpl(exactDataImpl);
abstractFile.convertTo();
输出内容
MySQL数据读取
转为TXT文件
桥接模式优缺点
优点
- 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则
- 抽象对象间的关联关系,使得不同的维度可以更加容易组合在一起
- 桥接模式可以取代多层继承方案,多层继承方案违背了“单一职责原则”,复用性较差,且类的个数非常多,桥接模式是比多层继承方案更好的解决方法
缺点
- 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程。
- )桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累。
桥接模式的适用场景
- 有两个或多个不同维度,切不同的维度都需要扩展
- 不希望使用继承或因为多层继承导致类的个数急剧增加,桥接模式非常适用
网友评论