1. 桥接模式
桥接模式(Bridge Pattern)是结构性设计模式,可以处理多个维度的对象变化。如果系统中存在两个独立的维度,通过桥接模式,可以使两者独立扩展,在抽象层建立关联关系,这个关联关系,就是桥接。
桥接模式的角色一共有四种。
-
Abstraction(抽象类):一个维度的抽象类,它一般是抽象类而不是接口,持有一个Implementor,即建立关联关系(桥接)。
-
Refined Abstraction(抽象类扩充):通常是具体类,实现Abstraction定义的抽象业务方法,调用Implementor的方法。
-
Implementor(实现类接口):另一个维度的抽象接口。
-
Concrete Implementor(具体实现类):负责实现Implementor接口,不同的Concrete Implementor提供不同的实现。
注意,桥接模式中两个独立的维度,就是Abstraction和Implementor。
2. 桥接模式举例
下面我们报表系统的例子,这个系统中有报表展示和数据采集两个维度,报表可以用表格或者图形展示;数据采集可能是采集数据库的数据,或是采集csv文件的数据。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | AbstractReport | Abstraction | 抽象类,抽象报表展示 |
2 | ChartReport | Refined Abstraction | 抽象类扩充,图形展示 |
3 | SheetReport | Refined Abstraction | 抽象类扩充,表格展示 |
4 | DatacCollector | Implementor | 实现类接口,抽象数据采集器 |
5 | DbDataCollector | Concrete Implementor | 具体实现类,数据库数据采集器 |
6 | CsvDataCollector | Concrete Implementor | 具体实现类,csv数据采集器 |
7 | BridgeMain | 客户端 | 调用演示 |
桥在AbstractReport和DatacCollector之间,它们是关联关系。
Bridge Pattern.png1. AbstractReport 类
// Abstraction 角色, 抽象报表
public abstract class AbstractReport {
// 数据采集器
protected DatacCollector datacCollector;
public void setDatacCollector(DatacCollector datacCollector) {
this.datacCollector = datacCollector;
}
// 报表显示
public abstract void view();
}
2. ChartReport 类
// Refined Abstraction角色,扩充了抽象类,调用在DataCollector中定义的业务方法。
public class ChartReport extends AbstractReport {
@Override
public void view() {
datacCollector.collect(); // 调用采集数据方法
System.out.println("以图形的方式展现报表");
}
}
**3. SheetReport **
// Refined Abstraction角色,扩充了抽象类,调用在DataCollector中定义的业务方法。
public class SheetReport extends AbstractReport {
@Override
public void view() {
datacCollector.collect();// 调用采集数据方法
System.out.println("以表格的形式显示报表。");
}
}
**4. DatacCollector **
// Implementor角色,数据采集器
public interface DatacCollector {
// 采集数据
void collect();
}
**5. DbDataCollector **
//Concrete Implementor角色,数据库数据采集器
public class DbDataCollector implements DatacCollector {
@Override
public void collect() {
System.out.println("我是数据库数据采集器,负责采集DB中的数据。");
}
}
6. CsvDataCollector
//Concrete Implementor角色,csv数据采集器
public class CsvDataCollector implements DatacCollector {
@Override
public void collect() {
System.out.println("我是CSV数据采集器,负责采集CSV数据。");
}
}
7. BridgeMain
// 客户端,调用演示,可以协调数据采集器和报表展示两个维度。
public class BridgeMain {
public static void main(String[] args) {
// 图形报表,使用DB中的数据。
// 也可以使用表格报表和CSV数据,是两个维度的任意组合。
AbstractReport report = new ChartReport();
DatacCollector datacCollector = new DbDataCollector();
report.setDatacCollector(datacCollector);
report.view();
}
}
3. 桥接模式总结
桥接模式应用于系统中有两个或多个维度的变化,桥建立在维度的抽象类(接口)之间。
优点:
分离抽象接口和实现,使它们都可以独立的变化,不同维度的子类之间产生更多的组合。
缺点:
代码复杂度提高,不易理解;需要在系统设计之初就做好抽象。
(完)
网友评论