標簽(空格分隔): 設計模式
背景需求:
java中沒有多繼承機制,當一個類存在兩個維度的變化,并且這兩個維度都需要擴展。當我們擴展一個維度的時候,會增加很多的子類,這樣的擴展成本是非常高的。
例如:我們有電腦
這個類,同時在電腦這個類下面,我們有分成臺式機
,筆記本
,平板電腦
,同時我們又在各個子類下面又分成各大品牌的電腦,如在臺式機
分類中增加聯想臺式機
,神州臺式機
,華碩臺式機
,同時在筆記本
分類中增加聯想筆記本
,神州筆記本
,華碩筆記本
,類似于這樣,一個類有兩個維度控制,一個是什么形式的電腦,另一個是什么品牌的電腦,這樣,如果們增加了一個維度的成員,則要增加出很多的子類,這對我們的擴展和維護的成本是非常大的。
為了解決這樣的問題,我們引入橋接模式,
首先我們定義一個維度接口(品牌接口),
public interface Brand {
void sall();
}
定義各種品牌實現類:
class LenovoBrand implements Brand{
@Override
public void sall() {
System.out.print("賣聯想品牌的");
}
}
class DellBrand implements Brand{
@Override
public void sall() {
System.out.print("賣戴爾品牌的");
}
}
定義第二位維度實現類,這個實現類持有另一個維度的對象,同時這個實現類提供的方法調用對另一維度變量方法適當應用。
public class Computer {
private Brand mBrand;
public Computer(Brand mBrand) {
this.mBrand = mBrand;
}
public void sall(){
mBrand.sall();
}
}
定義第二維度的實現類
public class Laptop extends Computer{
public Laptop(Brand mBrand) {
super(mBrand);
}
@Override
public void sall() {
super.sall();
System.out.println("筆記本");
}
}
public class Pad extends Computer{
public Pad(Brand mBrand) {
super(mBrand);
}
public void sall(){
super.sall();
System.out.println("賣pad的");
}
}
測試代碼:
public class Client {
public static void main(String[] args) {
Computer computer1 = new Laptop(new LevonBrand());
computer1.sall();
Computer computer2 = new Pad(new DellBrand());
computer2.sall();
}
}
測試結果:
賣聯想品牌的筆記本
賣戴爾品牌的pad
使用這樣的方式,當我們增加一個維度的成員是,我們可以很方便的實現對想要成員的擴展,例如當我們需要增加一個品牌的時候,我們不需要將這個品牌的筆記本,臺式機,pad形式的電腦的子類都有新建出來,但是在我們xueyao
橋接模式總結:
可以取代多層繼承方案,多層繼承違背了單一職責原則,復用性比較差,類的個數也非常多,橋接模式可以極大的減少子類的個數,從而降低管理和維護的成本。
橋接模式極大的提高了系統的可擴展性,在兩個變化的維度中擴展任意一個維度,都不需要修改原有的系統,符合開閉原則。