15-1 桥接模式讲解
15-2 桥接模式coding
桥接模式重要的就是把抽象和实现分离出来,然后中间通过组合来搭建他们之间的桥梁:
业务场景:中国有很多银行,有中国农业银行和中国工商银行;关于我们的账号,有定期账号和活期账号,
一个就是银行一个就是我们的账号;
有一个账户接口:
public interface Account {
/** 打开我们的账号,打开账号,就要返回账号 */
Account openAccount();
/** 打开我们的账号,查看为什么账户类型,是定期类型还是活期类型 */
void showAccountType();
}
而这个就是一个定期账号:
/** 定期的账号 */
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("这是一个活期账号");
}
}
现在,我们就去写一个银行类:将Account账户接口组合到这个银行类:
public abstract class Bank {
/** 只有子类能拿到这个Account的这个接口 */
protected Account account;
/** 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入 */
public Bank(Account account) {
this.account = account;
}
/** 这里声明成和接口里面的方法名一致,只是方便理解,Bank里面的方法要委托给Account接口里面的方法 */
abstract Account openAccount();
}
我们现在看到就是Account就是具体的实现,我们要通过这个接口的具体实现,而Bank就是抽象,它是一个抽象类,然后这个抽象类里面的某个行为委托给Account的这个接口;
在前面有说到桥接模式指的就是抽象和实现分离;而这里的实现正式这里的Account的实现类;
现在这个银行有两个子类去继承它:
一、中国农业银行类:
public class ABCBank extends Bank {
/**
* 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入
*
* @param account
*/
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国农业银行账号");
return account;
}
}
二、中国工商银行账号
public class ICBCBank extends Bank {
/**
* 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入
*
* @param account
*/
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行账号");
return account;
}
}
现在,这个类图如图所示:
Bank的这个抽象类通过组合的方式,把Account的这个接口组合了进来:
测试类如下:
public class Test {
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();
}
}
测试结果如下:
打开中国工商银行账号
这是一个定期账号
打开中国工商银行账号
这是一个活期账号
打开中国农业银行账号
这是一个活期账号
这里有一个小坑,这样来写的话,才算是委托给了接口里面的实现方法来执行:
public class ABCBank extends Bank {
/**
* 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入
*
* @param account
*/
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国农业银行账号");
account.openAccount();
return account;
}
}
这个就是现在的类图:
15-3 桥接模式源码解析(jdk)
- jdbc里面的Driver: