桥接模式

1.定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化;
      通过组合的方式建立两个类之间联系,而不是继承。

2.类型:结构型

3.适用场景:抽象和具体实现之间增加更多的灵活性;
        一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展;
        不希望使用继承,或因为多层继承导致系统类的个数剧增。

4.优点:分离抽象部分及其具体实现部分;提高了系统的可扩展性;
      符合开闭原则;符合合成复用原则。

5.缺点:增加了系统的理解与设计难度;需要正确地识别出系统中两个独立变化的维度。

6.相关设计模式:组合模式、适配器模式。

7.实例目录package

8.实例UML类图

9.代码

1 package com.geely.design.pattern.structural.bridge;
2 
3 public abstract class Bank {
4     protected Account account;
5     public Bank(Account account){
6         this.account = account;
7     }
8     abstract Account openAccount();
9 }
 1 package com.geely.design.pattern.structural.bridge;
 2 
 3 public class ABCBank extends Bank {
 4     public ABCBank(Account account) {
 5         super(account);
 6     }
 7 
 8     @Override
 9     Account openAccount() {
10         System.out.println("打开中国农业银行账号");
11         account.openAccount();
12         return account;
13     }
14 }
 1 package com.geely.design.pattern.structural.bridge;
 2 
 3 public class ICBCBank extends Bank {
 4     public ICBCBank(Account account) {
 5         super(account);
 6     }
 7 
 8     @Override
 9     Account openAccount() {
10         System.out.println("打开中国工商银行账号");
11         account.openAccount();
12         return account;
13     }
14 }
1 package com.geely.design.pattern.structural.bridge;
2 
3 public interface Account {
4     Account openAccount();
5     void showAccountType();
6 }
 1 package com.geely.design.pattern.structural.bridge;
 2 
 3 public class DepositAccount implements Account {
 4     @Override
 5     public Account openAccount() {
 6         System.out.println("打开定期账号");
 7         return new DepositAccount();
 8     }
 9 
10     @Override
11     public void showAccountType() {
12         System.out.println("这是一个定期账号");
13     }
14 }
 1 package com.geely.design.pattern.structural.bridge;
 2 
 3 public class SavingAccount implements Account {
 4     @Override
 5     public Account openAccount() {
 6         System.out.println("打开活期账号");
 7         return new SavingAccount();
 8     }
 9 
10     @Override
11     public void showAccountType() {
12         System.out.println("这是一个活期账号");
13     }
14 }
 1 package com.geely.design.pattern.structural.bridge;
 2 
 3 public class Test {
 4     public static void main(String[] args) {
 5         Bank icbcBank = new ICBCBank(new DepositAccount());
 6         Account icbcAccount = icbcBank.openAccount();
 7         icbcAccount.showAccountType();
 8 
 9         Bank icbcBank2 = new ICBCBank(new SavingAccount());
10         Account icbcAccount2 = icbcBank2.openAccount();
11         icbcAccount2.showAccountType();
12 
13         Bank abcBank = new ABCBank(new SavingAccount());
14         Account abcAccount = abcBank.openAccount();
15         abcAccount.showAccountType();
16     }
17 }

 

posted @ 2019-01-06 16:26  逢春  阅读(129)  评论(0编辑  收藏  举报