源代码
GitHub源代码
1.本文目标
本文目标是为了让大家认识并理解桥接模式
2.基本套路
定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变换
类型:结构型
选择关键点:是否可以将对象拆分成多个不相关的维度
设计原则:遵循单一职责、迪米特、开闭原则,体现功能复用
使用概率:20%
难度系数:中高
3.适用场景
1.抽象和具体之间增加更多的灵活性
2.一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
3.不希望使用继承,或因为多层继承导致系统类的个数剧增
4.使用步骤
用具体的栗子可以更好的理解,继续往下看
5.举个栗子
我们用具体的代码去更好的理解这个设计模式
5.1栗子说明
- 背景:中国有很多银行,有农业银行和工商银行,有自己的账号,然后分为定期和活期,我们想一下,一块是银行,一块是账号
- 目的:以后银行会越来越多,希望用桥接模式去进行设计,便于扩展
5.2使用步骤
实现代码如下:
步骤1.创建银行账号接口类
public interface Account {
//打开账号
Account openAccount();
//查看账号的类型(是活期还是定期)
void showAccountType();
}
步骤2. 创建定期账号和活期账号,实现于Account接口
//定期账号
public class DepositAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开定期账号");
return new DepositAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个定期账号");
}
}
//活期账号
public class SavingAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开活期账号");
//...
return new SavingAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
步骤3.创建银行抽象类,桥在这个类中
public abstract class Bank {
//通过组合的方式建立两个类的连线,桥在这里
protected Account account;
public Bank(Account account) {
this.account = account;
}
abstract Account openAccount();
}
步骤4.创建中国工商银行和中国农业银行,继承于Bank
//工商银行
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行账号");
account.openAccount();
return account;
}
}
//农业银行
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国农业银行账号");
account.openAccount();
return account;
}
}
步骤5. 测试
public static void main(String[] args) {
//工商银行,然后账号类型是 定期
Bank icbcBank = new ICBCBank(new DepositAccount());
Account icbcAccount = icbcBank.openAccount();
icbcAccount.showAccountType();
//工商银行,然后账号类型是 活期
Bank icbcBank2 = new ICBCBank(new SavingAccount());
Account icbcAccount2 = icbcBank2.openAccount();
icbcAccount2.showAccountType();
//农业银行,然后账号类型是 活期
Bank abcBank = new ABCBank(new SavingAccount());
Account abcAccount = abcBank.openAccount();
abcAccount.showAccountType();
}
6.优点
- 分离抽象部分和具体实现部分
- 提高了系统的可扩展性
- 符合开闭原则
- 符合合成复用原则
7.缺点
- 增加了系统的理解和设计难度
- 需要正确的识别出系统中两个独立变化的维度
8.总结
本文只是对桥接模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。
网友评论