介绍
抽象部分与具体实现部分分离,通过组合的方式建立联系,而不是继承
适用场景
- 抽象和实现之间需要更强的灵活性
- 一个类存在两个独立变化的维度,且两个维度都需要独立扩展
- 不希望使用继承
桥接和组合
桥接关注在平行级别类的组合
组合关注在部分和整体之间的组合
桥接和适配器
适配器是改变接口
桥接模式目的是分离抽象和实现
代码
public interface Account {
Account openAccount();
void showAccountType();
}
public class SavingAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开活期账号");
return new SavingAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
public class FixAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开定期账号");
return new FixAccount();
}
@Override
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 {
protected 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 abc = new ABCBank(new FixAccount());
Account account = abc.openAccount();
account.showAccountType();
abc = new ABCBank(new SavingAccount());
account = abc.openAccount();
account.showAccountType();
Bank icbc = new ICBCBank(new FixAccount());
account = abc.openAccount();
account.showAccountType();
icbc = new ICBCBank(new SavingAccount());
account = abc.openAccount();
account.showAccountType();
}
}
案例分析
银行:农业银行和工商银行
账户:活期账户和定期账户
账户和银行分为两个平行类,账户作为实现,银行作为抽象,银行通过组合的方式持有账户,将操作委托为账户。
账户和银行可以分别独立扩展,如果使用继承实现,每个银行下有两个账户方法,会产生类爆炸情况发生。
创建农业银行类后,如果要调用Account
对象的方法,直接委托(完全或部分委托)给持有的Account
对象即可。