一、定义
将抽象部分与它的具体实现部分分离,使它们都可以独立地变化
通过组合的方式建立两个类之间联系,而不是继承
类型:结构型
二、适用场景
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