【导读】现实中有很多是可以组合使用的,例如A有两种产品,B有三种产品,那么A和B可以有六种组合,类似于笛卡尔积。这就是桥接模式。
一、定义
将抽象部分与它的具体实现部分分离,使他们都可以独立变化。通过组合的方式建立两个类之间的联系,而不是继承。
比如组装电脑需要内存卡和主板,内存卡有三星、闪迪,主板有技嘉和华硕,那么此电脑组合有下列几种方式:
三星 | 闪迪 | |
---|---|---|
技嘉 | 三星 X 技嘉 | 闪迪 X 技嘉 |
华硕 | 三星 X 华硕 | 闪迪 X 华硕 |
二、示例 以银行卡为例,银行有中国银行、中国工商银行,存储方式有活期存储和定期存储两种方式。
抽象账号对象:
public interface Account {
public Account openAccount();
public void getAccountType();
}
活期存储账号:
public class CurrentAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开一个活期账号");
return new CurrentAccount();
}
@Override
public void getAccountType() {
System.out.println("这是一个活期账号");
}
}
定期存储账号:
public class FixAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开一个定期账号");
return new FixAccount();
}
@Override
public void getAccountType() {
System.out.println("这是一个定期账号");
}
}
抽象银行对象:
public abstract class Bank {
1、包含一个账号属性
protected Account account;
public Bank(Account account) {
this.account = account;
}
Account openAccount(){
return account;
};
}
工商银行对象:
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行的账号");
account.openAccount();
return account;
}
}
中国银行对象:
public class BOCBank extends Bank {
public BOCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国银行的账号");
account.openAccount();
return account;
}
}
测试类:只需要确定是什么银行以及什么账号
Bank bank = new BOCBank(new FixAccount());
Account account = bank.openAccount();
account.getAccountType();
运行结果:
看一下它们的类图:
两种不同的对象是以组合的形式存在,这样有利于扩展。
三、源码实例
(1)JDBC的DriverManager和DriverInfo
可以加在多种驱动
类加载的时候会将驱动进行加载至registeredDrivers列表中