推荐:Java设计模式汇总
桥接模式
定义
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
类型
结构型。
例子
这里举银行的例子,中国有很多种类型的银行,各种银行又有很多种不同的账号类型。
多重继承
桥接模式
从上面的两个图,可以看出桥接模式相较于多重继承的优势,当银行种类很多,账号类型也很多时,桥接模式就更加方便了,大家可以自己好好体会体会。
Account接口(账号)。
package com.kaven.design.pattern.structural.bridge;public interface Account {
Account openAccount();void showAccountType();
}
SavingAccount类(活期账号),实现了Account接口。
package com.kaven.design.pattern.structural.bridge;public class SavingAccount implements Account {
public Account openAccount() {
System.out.println("打开活期账号");return new SavingAccount();}public void showAccountType() {
System.out.println("这是一个活期账号");}
}
DepositAccount类(定期账号),实现了Account接口。
package com.kaven.design.pattern.structural.bridge;public class DepositAccount implements Account{
public Account openAccount() {
System.out.println("打开定期账号");return new DepositAccount();}public void showAccountType() {
System.out.println("这是一个定期账号");}
}
Bank抽象类(银行),与Account接口实例进行组合,这是桥接模式的关键所在。
package com.kaven.design.pattern.structural.bridge;public abstract class Bank {
protected Account account;public Bank(Account account){
this.account = account;}abstract Account openAccount();
}
ABCBank类(中国农业银行),继承了Bank类,并且将打开账号的行为委托给与自己组合的Account实例
。
package com.kaven.design.pattern.structural.bridge;public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);}Account openAccount() {
System.out.println("打开中国农业银行账号");//委托行为account.openAccount();return account;}
}
ICBCBank类(中国工商银行),继承了Bank类,并且将打开账号的行为委托给与自己组合的Account实例
。
package com.kaven.design.pattern.structural.bridge;public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);}Account openAccount() {
System.out.println("打开中国工商银行账号");//委托行为account.openAccount();return account;}
}
应用层代码:
package com.kaven.design.pattern.structural.bridge;public class Test {
public static void main(String[] args) {
Bank icbcBank = new ICBCBank(new DepositAccount());Account icbcAccount = icbcBank.openAccount();icbcAccount.showAccountType();Bank abcBank = new ABCBank(new SavingAccount());Account abcAccount = abcBank.openAccount();abcAccount.showAccountType();}
}
输出:
打开中国工商银行账号
打开定期账号
这是一个定期账号
打开中国农业银行账号
打开活期账号
这是一个活期账号
这里便完成了一个简单的桥接模式例子。
大家可以想一想,如果要使用多次继承来实现这个例子会是怎么样?扩展性又如何?
适用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系(组合或者聚合关系)。
- 抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化 子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
- 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
优点
? 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
? 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
? 实现细节对客户透明,可以对用户隐藏实现细节。
缺点
? 桥接模式的引入会增加系统的理解与设计难度,由于组合或者聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
? 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
如果有说错的地方,请大家不吝赐教(记得留言哦~~~~)。