更多java文章与项目资源、毕业设计、福利
关注公众号 程序猿forever
![32e0a9628fdd45da0194a6ea17364ad9.png](https://i-blog.csdnimg.cn/blog_migrate/8fb3358e4a36a57ac4543aceb99405ab.jpeg)
桥接模式
- 15-1 桥接模式讲解
- 15-2 桥接模式coding
- 15-3 桥接模式源码解析(jdk)
15-1 桥接模式讲解
![6b2c102d60bd18020841b121ad899aac.png](https://i-blog.csdnimg.cn/blog_migrate/0c86fc5b50e26900fb252e915d8d4d8e.jpeg)
![917dd2ecb56be121de875c6cf2978ebb.png](https://i-blog.csdnimg.cn/blog_migrate/beb81db0e403d4172567649b673f88ff.jpeg)
![2603a85e9889c7fc5cc334df490938bb.png](https://i-blog.csdnimg.cn/blog_migrate/c5b004e88f01de7f157f64b0c6942fc2.jpeg)
![ff35f548ea51821b6d40f3d8f8f1db70.png](https://i-blog.csdnimg.cn/blog_migrate/169f7daff9e1c3464fc0f32bcd4ef90b.jpeg)
![c8b5a919a75cad71364d781b930fc08d.png](https://i-blog.csdnimg.cn/blog_migrate/7197df06bbf9cbcc2b885856deeaeb9b.jpeg)
15-2 桥接模式coding
桥接模式重要的就是把抽象和实现分离出来,然后中间通过组合来搭建他们之间的桥梁:
业务场景:中国有很多银行,有中国农业银行和中国工商银行;关于我们的账号,有定期账号和活期账号,
一个就是银行一个就是我们的账号;
有一个账户接口:
public interface Account { /** 打开我们的账号,打开账号,就要返回账号 */ Account openAccount(); /** 打开我们的账号,查看为什么账户类型,是定期类型还是活期类型 */ void showAccountType();}12345678
而这个就是一个定期账号:
/** 定期的账号 */public class DepositAccount implements Account { @Override public Account openAccount() { System.out.println("定期账号"); return new DepositAccount(); } @Override public void showAccountType() { System.out.println("这是一个定期账号"); }}12345678910111213
这个是一个活期的账号:
/** 活期账号 */public class SavingAccount implements Account { @Override public Account openAccount() { System.out.println("打开活期账号"); return new SavingAccount(); } @Override public void showAccountType() { System.out.println("这是一个活期账号"); }}12345678910111213
现在,我们就去写一个银行类:将Account账户接口组合到这个银行类:
public abstract class Bank { /** 只有子类能拿到这个Account的这个接口 */ protected Account account; /** 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入 */ public Bank(Account account) { this.account = account; } /** 这里声明成和接口里面的方法名一致,只是方便理解,Bank里面的方法要委托给Account接口里面的方法 */ abstract Account openAccount();}12345678910111213
我们现在看到就是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; }}12345678910111213141516
二、中国工商银行账号
public class ICBCBank extends Bank { /** * 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入 * * @param account */ public ICBCBank(Account account) { super(account); } @Override Account openAccount() { System.out.println("打开中国工商银行账号"); return account; }}12345678910111213141516
现在,这个类图如图所示:
Bank的这个抽象类通过组合的方式,把Account的这个接口组合了进来:
![aef3605e1f04046a11f61c949a3095f1.png](https://i-blog.csdnimg.cn/blog_migrate/8ebef22f2d550b1766efc27e57430caf.jpeg)
测试类如下:
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(); }}123456789101112131415
测试结果如下:
打开中国工商银行账号
这是一个定期账号
打开中国工商银行账号
这是一个活期账号
打开中国农业银行账号
这是一个活期账号
这里有一个小坑,这样来写的话,才算是委托给了接口里面的实现方法来执行:
public class ABCBank extends Bank { /** * 组合的时候,可以通过构造器的方式来进行注入也可以通过set方法的方式来进行注入 * * @param account */ public ABCBank(Account account) { super(account); } @Override Account openAccount() { System.out.println("打开中国农业银行账号"); account.openAccount(); return account; }}1234567891011121314151617
![507e1d031a9b84d7e54b53e3e45c64cf.png](https://i-blog.csdnimg.cn/blog_migrate/6e2a7826e48d8d321d83a7fa74b65bb4.jpeg)
这个就是现在的类图:
![053e9be01b8d7395be241eed970acefe.png](https://i-blog.csdnimg.cn/blog_migrate/b0a422a44bdcb40b76a957b34e831666.jpeg)
15-3 桥接模式源码解析(jdk)
- jdbc里面的Driver: