Java設計模式之橋接模式
考慮一下生活中的場景,銀行存款有很多類型,最常見的是活期和定期,而銀行有很多家。比如中國農業銀行有活期和定期,中國工商銀行也有活期定期。下面看看橋接模式怎麼實現:
//新建接口,賬戶
public interface Account {
Account openAccount();
void showAccountType();
}
//定期賬戶類,實現接口
public class DepositeAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打開定期賬號");
return new DepositeAccount();
}
@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("這是活期賬號");
}
}
//抽象銀行類,要把Account接口引入此類
public abstract class Bank {
//account對象交給Bank的實現類
protected Account account;
public Bank(Account account) {
this.account = account;
}
//聲明一個抽象方法,與Account接口裏面的openAccount方法對應,方法名可以不相同
//此方法最終委託給Account接口實現類裏面的方法
abstract Account openAccount();
}
//銀行實現類,中國農業銀行
public class ABCBank extends Bank{
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打開中國農業銀行賬戶");
//委託出去,委託給接口實現類裏面的方法
account.openAccount();
//直接返回父類裏面獲取到的account對象
return account;
}
}
//銀行實現類,中國工商銀行
public class ICBCBank extends Bank{
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打開工商銀行賬戶");
//委託出去,委託給接口實現類裏面的方法
account.openAccount();
return account;
}
}
//調用
public static void main(String[] a){
Bank ban1=new ICBCBank(new DepositeAccount());
Account account1=ban1.openAccount();
account1.showAccountType();
Bank bank2=new ABCBank(new SavingAccount());
Account account2=bank2.openAccount();
account2.showAccountType();
}
//結果
打開工商銀行賬戶
打開定期賬號
這是定期賬號
打開中國農業銀行賬戶
打開活期賬號
這是活期賬號
橋接模式下,銀行類型與賬戶類型可以任意組合,這裏2*2有4種組合,如果再增加一種賬戶類型,就有2*3共6種組合,5個實現子類。
在不使用橋接模式時,假設有兩家銀行,三種賬戶,那麼A銀行下面創建三個賬戶對象,B銀行下面創建三個賬戶對象。這可能出現的問題是,如果銀行很多,賬戶類型也很多,將導致類爆炸。
看看橋接模式下的UML類圖。