標簽(空格分隔): 設(shè)計模式
背景需求:
java中沒有多繼承機制偏螺,當一個類存在兩個維度的變化预明,并且這兩個維度都需要擴展状知。當我們擴展一個維度的時候,會增加很多的子類堡纬,這樣的擴展成本是非常高的聂受。
例如:我們有電腦
這個類,同時在電腦這個類下面烤镐,我們有分成臺式機
蛋济,筆記本
,平板電腦
炮叶,同時我們又在各個子類下面又分成各大品牌的電腦碗旅,如在臺式機
分類中增加聯(lián)想臺式機
,神州臺式機
镜悉,華碩臺式機
祟辟,同時在筆記本
分類中增加聯(lián)想筆記本
,神州筆記本
积瞒,華碩筆記本
川尖,類似于這樣,一個類有兩個維度控制茫孔,一個是什么形式的電腦叮喳,另一個是什么品牌的電腦,這樣缰贝,如果們增加了一個維度的成員馍悟,則要增加出很多的子類,這對我們的擴展和維護的成本是非常大的剩晴。
為了解決這樣的問題锣咒,我們引入橋接模式侵状,
首先我們定義一個維度接口(品牌接口),
public interface Brand {
void sall();
}
定義各種品牌實現(xiàn)類:
class LenovoBrand implements Brand{
@Override
public void sall() {
System.out.print("賣聯(lián)想品牌的");
}
}
class DellBrand implements Brand{
@Override
public void sall() {
System.out.print("賣戴爾品牌的");
}
}
定義第二位維度實現(xiàn)類毅整,這個實現(xiàn)類持有另一個維度的對象趣兄,同時這個實現(xiàn)類提供的方法調(diào)用對另一維度變量方法適當應用。
public class Computer {
private Brand mBrand;
public Computer(Brand mBrand) {
this.mBrand = mBrand;
}
public void sall(){
mBrand.sall();
}
}
定義第二維度的實現(xiàn)類
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();
}
}
測試結(jié)果:
賣聯(lián)想品牌的筆記本
賣戴爾品牌的pad
使用這樣的方式悼嫉,當我們增加一個維度的成員是艇潭,我們可以很方便的實現(xiàn)對想要成員的擴展,例如當我們需要增加一個品牌的時候戏蔑,我們不需要將這個品牌的筆記本蹋凝,臺式機,pad形式的電腦的子類都有新建出來总棵,但是在我們xueyao
橋接模式總結(jié):
可以取代多層繼承方案鳍寂,多層繼承違背了單一職責原則,復用性比較差情龄,類的個數(shù)也非常多迄汛,橋接模式可以極大的減少子類的個數(shù),從而降低管理和維護的成本刃唤。
橋接模式極大的提高了系統(tǒng)的可擴展性隔心,在兩個變化的維度中擴展任意一個維度白群,都不需要修改原有的系統(tǒng)尚胞,符合開閉原則。