定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化,通过组合的方式建立两个类之间的联系,而不是继承;
类型:结构型;
适用场景
- 抽象与具体实现之间增加更多的灵活性;
- 一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要独立进行扩展;
- 不希望使用继承,因为多层继承会使系统类的数量剧增;
优点
- 分离抽象部分与其具体实现部分;
- 提高了系统的可扩展性;
- 符合开闭原则;
- 符合组合复用原则;
缺点
- 增加系统的理解与设计难度;
- 需要正确地识别出系统中两个独立变化的维度;
举例
// 账户接口
public interface Account {
Account openAccount();
void showAccountType();
}
// 定期账户
public class DepositAccount implements Account {
public Account openAccount() {
System.out.println("打开一个定期账号");
return new DepositAccount();
}
public void showAccountType() {
System.out.println("这是一个定期账号");
}
}
// 活期账号
public class SavingAccount implements Account {
public Account openAccount() {
System.out.println("打开一个活期账号");
return new SavingAccount();
}
public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
// 银行抽象类
public abstract class Bank {
protected Account account;
public Bank(Account account) {
this.account = account;
}
abstract Account openAccount();
}
// 中国农业银行
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开一个中国农业银行账号");
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 Test {
public static void main(String[] args) {
Bank abcBank = new ABCBank(new SavingAccount());
Account account1 = abcBank.openAccount();
account1.showAccountType();
Bank icbcBank = new ICBCBank(new DepositAccount());
Account account2 = icbcBank.openAccount();
account2.showAccountType();
}
}
// 输出结果:
打开一个中国农业银行账号
打开一个活期账号
这是一个活期账号
打开一个中国商业银行账号
打开一个定期账号
这是一个定期账号
jdbc源码
com.jdbc.mysql包下的Driver和DriverManager使用了桥接模式。
public static synchronized void registerDriver(java.sql.Driver driver,
DriverAction da)
throws SQLException {
/* Register the driver if it has not already been added to our list */
if(driver != null) {
registeredDrivers.addIfAbsent(new DriverInfo(driver, da));
} else {
// This is for compatibility with the original DriverManager
throw new NullPointerException();
}
println("registerDriver: " + driver);
}