作用

将抽象部分与它的具体实现部分分离,使他们都可以独立的变化
通过组合的方式创建两个类之间的联系,而不是继承
对抽象事物进一步化的产物
抽象和具体实现之间增加更多的灵活性,可以排列组合了

Demo设计

以不同银行的不同账号为例
账号类型有很多,比如活期、定期
银行也有很多种,比如农行,工行
实现银行与账号类型之间的排列组合,比如农行的活期卡

账号接口

  1. public interface Account {
  2. /**
  3. * 开启账号
  4. *
  5. * @return
  6. */
  7. Account openAccount();
  8. /**
  9. * 账号类型
  10. */
  11. void showAccountType();
  12. }

实现类

定期账号

  1. public class DepositAccount implements Account {
  2. @Override
  3. public Account openAccount() {
  4. return new DepositAccount();
  5. }
  6. @Override
  7. public void showAccountType() {
  8. System.out.println("这是一个定期账号");
  9. }
  10. }

活期账号

  1. public class SavingAccount implements Account {
  2. @Override
  3. public Account openAccount() {
  4. return new SavingAccount();
  5. }
  6. @Override
  7. public void showAccountType() {
  8. System.out.println("活期账号");
  9. }
  10. }

银行类

先定义一个抽象类,通过子类继承来实现具体的银行的账户信息
在银行类中注入实现账户接口的对象

  1. public abstract class Bank {
  2. private Account account;
  3. public Bank(Account account) {
  4. this.account = account;
  5. }
  6. public Account getAccount() {
  7. return account;
  8. }
  9. protected abstract Account openAccount();
  10. }

子类

工商行

  1. public class ICBCBank extends Bank {
  2. public ICBCBank(Account account) {
  3. super(account);
  4. }
  5. @Override
  6. protected Account openAccount() {
  7. System.out.println("中国工商银行账号开户");
  8. return super.getAccount();
  9. }
  10. }

农行

  1. public class ABCBank extends Bank {
  2. public ABCBank(Account account) {
  3. super(account);
  4. }
  5. @Override
  6. protected Account openAccount() {
  7. System.out.println("中国农业银行账号开户");
  8. return super.getAccount();
  9. }
  10. }

使用

new银行对象时可通过注入的方式,使得不同银行和不同账号实现排列组合

  1. public static void main(String[] args) {
  2. Bank icbcBank = new ICBCBank(new DepositAccount());
  3. Account icbcAccount = icbcBank.openAccount();
  4. icbcAccount.showAccountType();
  5. Bank abcBank = new ICBCBank(new SavingAccount());
  6. Account abcAccount = abcBank.openAccount();
  7. abcAccount.showAccountType();
  8. }

通过组合的方式,实现桥接,让类之间配合使用
image.png

小结

通过组合的方式使多个类配合工作,和适配器模式有点像
具体区别是适配器模式是配合使用已有的接口
桥接是分离抽象和具体的实现