1 代码演练
1.1 代码演练1
1.2 代码演练2
1 代码演练
1.1 代码演练1
需求:
打印出从银行获取的账号类
优点:
a 假如我只用用一个银行接口 去获取账号的内容,银行实现类要有定期账号和活期账号两个方法,如果实现类特别多,很容易类爆炸。
b 而使用桥接模式可以 让实现(账号类)和抽象(银行类)分离,银行属性增加修改银行类即可,账号类属性增加修改账号类即可。逻辑清晰,同时也解决了上述类爆炸的情况。
uml:
账号接口:
package com.geely.design.pattern.structural.bridge; /** * 银行账号接口,有存款账号和活期账号 两种账号 */ public interface Account { //获得账号 Account openAccount(); //查看账号类型,是活期账号还是 定期账号 void showAccount(); }
活期账号:
package com.geely.design.pattern.structural.bridge; public class SavingAccount implements Account{ @Override public Account openAccount() { System.out.println("打开活期账号"); return new SavingAccount(); } @Override public void showAccount() { System.out.println("这是活期账号"); } }
定期账号:
package com.geely.design.pattern.structural.bridge; public class DepositAccount implements Account { @Override public Account openAccount() { System.out.println("打开定期账号"); return new DepositAccount(); } @Override public void showAccount() { System.out.println("这是一个定期账号"); } }
银行接口:
package com.geely.design.pattern.structural.bridge; /** * 该类要写成一个抽象类,因为可能有农业银行,工商银行等银行继承该类 */ public abstract class Bank { /** * 声明子类,因为银行查看账号 需要引用到账号类 */ protected Account account; /** * 通过构造方法注入银行账号 */ public Bank(Account account) { this.account = account; } abstract Account openAccount(); }
ABC银行:
package com.geely.design.pattern.structural.bridge; /** * 创建中国农业银行 */ public class ABCBank extends Bank{ public ABCBank(Account account) { super(account); } @Override Account openAccount() { System.out.println("打开中国农业银行账号"); return account; } }
爱存不存银行:
package com.geely.design.pattern.structural.bridge; public class ICBCBank extends Bank{ public ICBCBank(Account account) { super(account); } @Override Account openAccount() { System.out.println("打开中国工商银行"); return account; } }
测试类:
package com.geely.design.pattern.structural.bridge; public class Test { public static void main(String [] args){ Bank bank1 = new ICBCBank(new DepositAccount()); Account account1 = bank1.openAccount(); account1.showAccount(); Bank bank2 = new ICBCBank(new SavingAccount()); Account account2 = bank2.openAccount(); account2.showAccount(); Bank bank3 = new ABCBank(new DepositAccount()); Account account3 = bank3.openAccount(); account3.showAccount(); } }
打印日志:
打开中国工商银行
这是一个定期账号
打开中国工商银行
这是活期账号
打开中国农业银行账号
这是一个定期账号
Process finished with exit code 0
1.2 代码演练2(补充1.1的缺陷:没有将委托实现)
注意看:
ABCBANK,爱存不存Bank和打印日志。其余类同1.1,不再展示。
UML类图:
ABCBank:
package com.geely.design.pattern.structural.bridge; /** * 创建中国农业银行 */ public class ABCBank extends Bank{ public ABCBank(Account account) { super(account); } @Override Account openAccount() { account.openAccount(); System.out.println("打开中国农业银行账号"); return account; } }
爱存不存Bank:
package com.geely.design.pattern.structural.bridge; public class ICBCBank extends Bank{ public ICBCBank(Account account) { super(account); } @Override Account openAccount() { account.openAccount(); System.out.println("打开中国工商银行"); return account; } }
打印日志:
打开定期账号
打开中国工商银行
这是一个定期账号
打开活期账号
打开中国工商银行
这是活期账号
打开定期账号
打开中国农业银行账号
这是一个定期账号
Process finished with exit code 0
诸葛