1 基础知识
定义:将抽象部分与它的具体实现部分分离,使得它们都可以独立变化。特征:通过组合的方式建立两个之间的联系而不是继承。
使用场景:抽象和具体实现之间增加更多的灵活性;一个类存在两个(多个)独立变化的维度,且这两个(多个)维度需要独立扩展即抽象和具体实现独立扩展;不希望使用继承或因多层继承导致类爆炸。
优点:分离抽象部分及具体实现部分;提高了系统的可扩展性;符合开闭原则;符合合成复用原则。缺点:增加了系统的理解与设计难度;需要正确地识别出系统中两个独立变化的维度。
2 代码示例
使用场景:银行有许多如农业银行、工商银行;银行中的账号类页游定期、活期等。银行和账号之间可以通过组合实现多种场景。
账号接口:
public interface Account { Account openAccount(); void showAccountType(); }
账号接口的实现:定期账号 DepositAccount
public class DepositAccount implements Account { @Override public Account openAccount() { System.out.println("打开定期账号"); return new DepositAccount(); } @Override public void showAccountType() { System.out.println("这是一个定期账号"); } }
账号接口的实现:活期账号
public class SavingAccount implements Account { @Override public Account openAccount() { System.out.println("打开活期账号"); //可以添加自己特有的代码 return new SavingAccount(); } @Override public void showAccountType() { System.out.println("这是一个活期账号"); } }
抽象银行类:
public abstract class Bank { protected Account account; public Bank(Account account){ this.account = account; } //抽象的方法名字不一定要与Account中的相同 abstract Account openAccount(); }
具体银行类:
public class ABCBank extends Bank { public 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; } }
至此其类关系图可以清楚的体现如何桥接的:
Account就是一座桥梁,使具体账户类与抽象的银行间进行组合,银行和账号之间可以进行独立的发展。在具体银行类时一定要有一个委托行为的方法,不要让银行去打开账号。
应用层:
public class Test { public static void main(String[] args) { Bank icbcBank = new ICBCBank(new DepositAccount()); Account icbcAccount = icbcBank.openAccount(); icbcAccount.showAccountType(); Bank icbcBank2 = new ICBCBank(new SavingAccount()); Account icbcAccount2 = icbcBank2.openAccount(); icbcAccount2.showAccountType(); Bank abcBank = new ABCBank(new SavingAccount()); Account abcAccount = abcBank.openAccount(); abcAccount.showAccountType(); } }
0