作用
将抽象部分与它的具体实现部分分离,使他们都可以独立的变化
通过组合的方式创建两个类之间的联系,而不是继承
对抽象事物进一步化的产物
抽象和具体实现之间增加更多的灵活性,可以排列组合了
Demo设计
以不同银行的不同账号为例
账号类型有很多,比如活期、定期
银行也有很多种,比如农行,工行
实现银行与账号类型之间的排列组合,比如农行的活期卡
账号接口
public interface Account {
/**
* 开启账号
*
* @return
*/
Account openAccount();
/**
* 账号类型
*/
void showAccountType();
}
实现类
定期账号
public class DepositAccount implements Account {
@Override
public Account openAccount() {
return new DepositAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个定期账号");
}
}
活期账号
public class SavingAccount implements Account {
@Override
public Account openAccount() {
return new SavingAccount();
}
@Override
public void showAccountType() {
System.out.println("活期账号");
}
}
银行类
先定义一个抽象类,通过子类继承来实现具体的银行的账户信息
在银行类中注入实现账户接口的对象
public abstract class Bank {
private Account account;
public Bank(Account account) {
this.account = account;
}
public Account getAccount() {
return account;
}
protected abstract Account openAccount();
}
子类
工商行
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
protected Account openAccount() {
System.out.println("中国工商银行账号开户");
return super.getAccount();
}
}
农行
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}
@Override
protected Account openAccount() {
System.out.println("中国农业银行账号开户");
return super.getAccount();
}
}
使用
new银行对象时可通过注入的方式,使得不同银行和不同账号实现排列组合
public static void main(String[] args) {
Bank icbcBank = new ICBCBank(new DepositAccount());
Account icbcAccount = icbcBank.openAccount();
icbcAccount.showAccountType();
Bank abcBank = new ICBCBank(new SavingAccount());
Account abcAccount = abcBank.openAccount();
abcAccount.showAccountType();
}
小结
通过组合的方式使多个类配合工作,和适配器模式有点像
具体区别是适配器模式是配合使用已有的接口
桥接是分离抽象和具体的实现