介绍
抽象部分与具体实现部分分离,通过组合的方式建立联系,而不是继承
适用场景
抽象和实现之间需要更强的灵活性一个类存在两个独立变化的维度,且两个维度都需要独立扩展不希望使用继承
桥接和组合
桥接关注在平行级别类的组合 组合关注在部分和整体之间的组合
桥接和适配器
适配器是改变接口 桥接模式目的是分离抽象和实现
代码
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对象即可。