一、定义
将抽象部分与它的具体实现部分分离,使它们都可以独立地变化
通过组合的方式建立两个类之间联系,而不是继承
类型:结构型
二、适用场景
1、抽象和具体实现之间增加更多的灵活性
2、一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
3、不希望适用继承,或因为多层继承导致系统的类的个数剧增
三、优点
1、分离抽象部分及具体实现部分
2、提高了系统的可扩展性
3、符合开闭原则
4、符合合成复用原则
四、缺点
1、增加了系统的理解和设计难度
2、需要正确地识别系统中两个独立变化的维度
五、与桥接相关的设计模式
1、桥接模式和组合模式
组合模式强调部分和整体间的组合
桥接模式强调平行级别上不同类的组合
2、桥接模式和适配器模式
两个模式都是让某个东西配合工作
适配器模式的目的是改变已有的接口,让它们之间可以相互的配合。适配器模式可以把功能相似接口不同的类适配起来。
桥接模式是分离抽象和具体的实现,目的是分离。
六。Coding
场景: 银行(中国农业银行,中国工商银行),账号(活期账号,定期账号)。交叉后就有四种组合。随着银行的增多,账号类型的增多。那么久适用用桥接模式。
1、 创建账号
public interface Account { Account openAccount(); void showAccountType(); }
2、创建定期账号
/**
* 定期账号
*/
public class DepositeAccount implements Account{
@Override
public Account openAccount() {
System.out.println("打开定期账号");
return new DepositeAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个定期账号");
}
}
3、创建活期账号
public class SavingAccount implements Account{
@Override
public Account openAccount() {
System.out.println("打开活期账号");
return new SavingAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
4、创建银行
public abstract class Bank { protected Account account; public Bank(Account account){ this.account = account; } abstract Account openAccount(); }
5、农业银行
/**
* 农业银行
*/
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国农业银行账号");
account.openAccount();
return account;
}
}
6、工商银行
/**
* 工商银行
*/
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行账号");
account.openAccount();
return account;
}
}
7、UML图

右边Bank是抽象部分。
左边openAccount和showAccountType是实现。
Bank和Account是组合关系。
桥接模式的角色:(来自百度百科)
Abstraction(抽象化角色) Bank为抽象类。抽象化给出的定义,并保存一个对实现化对象的引用。
Implementor(实现化角色) Account实现类接口。这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
ConcreteImplementor(具体实现化角色) SavingAccount类和DepositAccont为具体实现类。这个角色给出实现化角色接口的具体实现。
RefinedAbstraction(修正抽象化角色) ABCBank修正抽象化角色。扩展抽象化角色,改变和修正父类对抽象化的定义。
8、测试类
public class Test {
public static void main(String[] args) {
Bank icbcBank = new ICBCBank(new DepositeAccount());
Account icbcAccount = icbcBank.openAccount();
icbcAccount.showAccountType();
Bank abcBank = new ICBCBank(new SavingAccount());
Account saveAccount = abcBank.openAccount();
saveAccount.showAccountType();
}
}
三、在源码中的使用
1、JDBC的Driver接口

DriverManager和DriverInfo
