桥接模式

1 概念

1 定义

桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。

类型:结构型

我们大家都熟悉,顾名思义就是用来将河的两岸联系起来的。而此处的桥是用来将两个独立的结构联系起来,而这两个被联系起来的结构可以独立的变化。

2 应用场景

  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。(如中国工商银行 年付账号,会根据银行和存储方式两个维度进行扩展)
  • 对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

3 优缺点

优点:

  • 抽象与实现分离,扩展能力强
  • 使用了组合,符合合成复用原则

缺点:

  • 增加了系统的复杂度。要求开发者可以正确地识别出系统中两个独立变化的维度
  • 增加了系统的设计难度。

2 代码实现

场景:

有一个银行类,他可以扩展出两个子类:中国工商银行和中国农业银行。希望这两个银行都支持月月存和年存这两种存储方式,由于已经有两个类,所以需要创建 中国工商银行+月月存,中国工商银行+年存,中国农业银行+月月存,中国农业银行+年存,这四种类来支持。

如果需要新增银行或者新增存储方式,将导致代码复杂程度指数增长。

解决:在银行和存储方式这两个独立的维度分别扩展,适用组合的方式建立关联。

1
2
3
public interface Account {
Account createAccount();
}
1
2
3
4
5
6
7
public class MonthSavingAccount implements Account {
@Override
public Account createAccount() {
System.out.println("新建一个月存储账号。。。");
return new MonthSavingAccount();
}
}
1
2
3
4
5
6
7
8
public class YearSavingAccount implements Account {
@Override
public Account createAccount() {
System.out.println("新建一个年存储账号。。。");
//...
return new YearSavingAccount();
}
}
1
2
3
4
5
6
7
public abstract class Bank {
protected Account account;
public Bank(Account account){
this.account = account;
}
abstract Account createAccount();
}
1
2
3
4
5
6
7
8
9
10
11
12
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}

@Override
Account createAccount() {
System.out.println("打开中国农业银行账号管理系统。。。");
account.createAccount();
return account;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}

@Override
Account createAccount() {
System.out.println("打开中国工商银行账号管理系统。。。");
account.createAccount();
return account;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test {
public static void main(String[] args) {
// 新建一个工商银行 + 月存储账号
Bank icbcBank = new ICBCBank(new MonthSavingAccount());
icbcBank.createAccount();

// 新建一个工商银行 + 年存储账号
Bank icbcBank2 = new ICBCBank(new YearSavingAccount());
icbcBank2.createAccount();

// 新建一个农业银行 + 年存储账号
Bank abcBank = new ABCBank(new YearSavingAccount());
abcBank.createAccount();
}
}

输出:

打开中国工商银行账号管理系统。。。
新建一个月存储账号。。。
打开中国工商银行账号管理系统。。。
新建一个年存储账号。。。
打开中国农业银行账号管理系统。。。
新建一个年存储账号。。。


桥接模式
http://example.com/桥接模式/
作者
Panyurou
发布于
2023年10月4日
许可协议