委托 接口 抽象类_桥接模式,搭建接口的桥梁

更多java文章与项目资源、毕业设计、福利

关注公众号 程序猿forever

32e0a9628fdd45da0194a6ea17364ad9.png

桥接模式

  • 15-1 桥接模式讲解
  • 15-2 桥接模式coding
  • 15-3 桥接模式源码解析(jdk)

15-1 桥接模式讲解

6b2c102d60bd18020841b121ad899aac.png

917dd2ecb56be121de875c6cf2978ebb.png

2603a85e9889c7fc5cc334df490938bb.png

ff35f548ea51821b6d40f3d8f8f1db70.png

c8b5a919a75cad71364d781b930fc08d.png

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

测试类如下:

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

这个就是现在的类图:

053e9be01b8d7395be241eed970acefe.png

15-3 桥接模式源码解析(jdk)

  1. jdbc里面的Driver:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值