【设计模式-桥接模式】

时间:2022-07-24
本文章向大家介绍【设计模式-桥接模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

【导读】现实中有很多是可以组合使用的,例如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列表中