25抛人、Android設(shè)計(jì)模式---(連接兩地的交通樞紐)橋接模式

一弛姜、介紹,定義

又稱橋梁模式妖枚,結(jié)構(gòu)型設(shè)計(jì)模式廷臼。
承接者連接 兩邊 的作用,兩邊指抽象部分和實(shí)現(xiàn)部分绝页。

將 抽象部分 和 實(shí)現(xiàn)部分 分離荠商,使它們都可以獨(dú)立地進(jìn)行變化。

二续誉、使用場(chǎng)景

對(duì)于不希望使用繼承或因多層次繼承導(dǎo)致系統(tǒng)類的個(gè)數(shù)急劇增加的系統(tǒng)莱没,考慮使用橋接模式。
需要在構(gòu)件的抽象化角色和具體角色之間增加更多靈活性酷鸦,避免兩層次間建立靜態(tài)的繼承關(guān)系饰躲,可通過(guò)橋接模式使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。
一個(gè)類存在兩個(gè)獨(dú)立變化的維度臼隔,且這兩個(gè)維度都需進(jìn)行擴(kuò)展嘹裂。
任何多維度變化類或多個(gè)樹狀類之間的耦合可通過(guò)橋接模式解耦。

三躬翁、UML類圖

32.png

四焦蘑、通用代碼

Abstraction:抽象部分該類保持一個(gè)對(duì)實(shí)現(xiàn)部分對(duì)象的引用盯拱,抽象部分中的方法需要調(diào)用實(shí)現(xiàn)部分的對(duì)象來(lái)實(shí)現(xiàn)盒发。該類一般為抽象類例嘱。
RefinedAbstraction:優(yōu)化的抽象部分抽象部分的具體實(shí)現(xiàn),該類一般是對(duì)抽象部分的方法進(jìn)行完善和擴(kuò)展宁舰。
Implementor:實(shí)現(xiàn)部分可以為接口或抽象類拼卵,其方法不一定要與抽象部分中的一致,一般情況下是由實(shí)現(xiàn)部分提供基本的操作蛮艰,而抽象部分定義的則是基于實(shí)現(xiàn)部分這些基本操作的業(yè)務(wù)方法腋腮。
ConcreteImplementorA/B:實(shí)現(xiàn)部分的具體實(shí)現(xiàn)完成實(shí)現(xiàn)部分中定義的具體邏輯。

// 實(shí)現(xiàn)部分的抽象接口
public interface Implementor { 
    /**  * 實(shí)現(xiàn)抽象部分的具體方法   */
    public void operationImpl();
}
// 實(shí)現(xiàn)部分具體的實(shí)現(xiàn)
public class ConcreteImplementorA implements Implementor { 
    @Override   
    public void operationImpl() {      
    // 忽略實(shí)現(xiàn)邏輯   
    }
}
// 抽象部分
public abstract class Abstraction {    
    // 聲明一私有成員變量引用實(shí)現(xiàn)部分的對(duì)象   
    private Implementor mImplementor;      
     /**  * 通過(guò)實(shí)現(xiàn)部分對(duì)象的引用構(gòu)造抽象部分的對(duì)象  *
     @param implementor 實(shí)現(xiàn)部分對(duì)象的引用  */
     public Abstraction(Implementor implementor) {      
         mImplementor = implementor; 
     }       
    /**  * 通過(guò)調(diào)用實(shí)現(xiàn)部分具體的方法實(shí)現(xiàn)具體的功能  */
    public void operation() {       
        mImplementor.operationImpl();   
    }   
}
// 優(yōu)化的抽象部分
public class RefinedAbstraction extends Abstraction {    
    public RefinedAbstraction(Implementor implementor) {        
        super(implementor);
    }       
    /**  * 對(duì) Abstraction 中的方法進(jìn)行擴(kuò)展    */ 
    public void refinedOperation() {       
         // 忽略實(shí)現(xiàn)邏輯  
     }
}
// 客戶端實(shí)現(xiàn)
public class Client { 
    public static void main(String[] args) {        
        RefinedAbstraction abstration = new RefinedAbstraction( new ConcreteImplementorA );                 
        abstraction.operation();        
        abstraction.refinedOperation(); 
    }
}

五壤蚜、簡(jiǎn)單實(shí)現(xiàn)

大家都知道去喝咖啡一般分為四種即寡。大杯加糖,大杯不加糖袜刷,小貝加糖聪富,小杯不加糖,對(duì)于一杯咖啡來(lái)說(shuō)這4中就是兩種變化著蟹,一種是大杯與小杯墩蔓,加糖與不加糖,這兩種變化胡良獨(dú)立變化萧豆。這里就可以用橋接模式奸披。
這里的Coffee.java代表抽象部分Abstraction

public abstract class Coffee {
    protected  CoffeeAddttives addttives;
 
    public Coffee(CoffeeAddttives addttives) {
        super();
        this.addttives = addttives;
    }
    
    public abstract void makeCoffee();
}

LargeCoffee,SmallCoffee代表 RefinedAbstraction優(yōu)化的抽象部分

public class LargeCoffee extends Coffee {
    public LargeCoffee(CoffeeAddttives addttives) {
        super(addttives);
    }
 
    @Override
    public void makeCoffee() {
        System.out.println("小杯的" + addttives.addSomething() + "咖啡");
    }
}

public class SmallCoffee extends Coffee {
    public SmallCoffee(CoffeeAddttives addttives) {
        super(addttives);
    }
    @Override
    public void makeCoffee() {
        System.out.println("大杯的" + addttives.addSomething() + "咖啡");
    }
}

CoffeeAddttives也就是Implementor角色涮雷,實(shí)現(xiàn)部分的抽象接口

/**
 * 咖啡添加劑  往咖啡添加糖或者原味
 */
public abstract class CoffeeAddttives {
    public abstract String addSomething();
}

Sugar阵面、Ordinary也就是ConcreImplementor角色,

public class Ordinary extends CoffeeAddttives {
    @Override
    public String addSomething() {  
        return "原味";
    }
}

public class Sugar extends CoffeeAddttives {
    @Override
    public String addSomething() {  
        return "加糖";
    }
}

客戶端

public class Client {
    public static void main(String[] args) {
        //準(zhǔn)備原味
        Ordinary ordinary = new Ordinary();
        
        //準(zhǔn)備糖
        Sugar sugar = new Sugar();
        //原味大杯
        LargeCoffee largeCoffee = new LargeCoffee(ordinary);
        largeCoffee.makeCoffee();
        //加糖大杯
        largeCoffee = new LargeCoffee(sugar);
        largeCoffee.makeCoffee();
        
        //原味小杯
        SmallCoffee smallCoffee = new SmallCoffee(ordinary);
        smallCoffee.makeCoffee();
        //加糖小杯
        smallCoffee = new SmallCoffee(sugar);
        smallCoffee.makeCoffee();
    }
}

小杯的原味咖啡
小杯的加糖咖啡
大杯的原味咖啡
大杯的加糖咖啡

這里的CoffeeAddttives對(duì)應(yīng)的是UML類圖中的實(shí)現(xiàn)部分也就是Implementor角色洪鸭,而Coffee對(duì)應(yīng)抽象部分膜钓,也就是Abstraction角色。
另外模式中定義的“抽象”與“實(shí)現(xiàn)”實(shí)質(zhì)上對(duì)應(yīng)的兩個(gè)獨(dú)立變化為 維護(hù)卿嘲,所以上文才說(shuō)任何維度辯護(hù)A類或者說(shuō)多個(gè)樹狀類之間的耦合都可以使用橋接模式來(lái)實(shí)現(xiàn)解耦颂斜。

這里使用橋接模式也就是將是否加糖與大小杯兩個(gè)維度實(shí)現(xiàn)了解耦。

此時(shí)如果我們想加個(gè)中杯的咖啡拾枣,只需要添加一個(gè)類

public class MiddleCoffee extends Coffee {
    public MiddleCoffee(CoffeeAddttives addttives) {
        super(addttives);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void makeCoffee() {
        System.out.println("中杯的" + addttives.addSomething() + "咖啡");
    }
}

客戶端稍作修改即可沃疮。添加以下代碼

        //原味小杯
        MiddleCoffee middleCoffee = new MiddleCoffee(ordinary);
        middleCoffee.makeCoffee();
        //加糖小杯
        middleCoffee = new MiddleCoffee(sugar);
        middleCoffee.makeCoffee();

簡(jiǎn)單實(shí)現(xiàn)2

蘋果、聯(lián)想梅肤、戴爾 都有 平板司蔬、筆記本、臺(tái)式機(jī)


1.png

由圖可見(jiàn)姨蝴,繼承關(guān)系復(fù)雜俊啼,要新增一個(gè)需要在每個(gè)下面都分別添加,違反單一原則

建立品牌類接口

public interface Brand{
  void info();
}

各個(gè)具體品牌:

//聯(lián)想
public class Lenovo implements Brand{
  @Override
  public void info(){
    System.out.println("聯(lián)想");
  }
}
//蘋果
public class Apple implements Brand{
  @Override
  public void info(){
    System.out.println("蘋果");
  }
}
...

以抽象的電腦類為例

public abstract class Computer{
  //組合左医、品牌
  protected Brand brand;
  
  public Compluter (Brand brand){
    this.brand = brand;
  }
  public void info(){
    brand.info(); //品牌
  }
}

具體的桌面電腦

class Desktop extends Computer{
  public Desktop(Brand){
    super.info();
  }
  @Override
  public void info(){
    super.info();
    System.out.println("臺(tái)式機(jī)");
  }
}

測(cè)試類

puvlic class Test{
  public static void main(String []args){
    Computer computer = new Laptop(new Apple());
    computer.info();
  }
}

computer增加不會(huì)影響品牌類

類圖(對(duì)比上面的圖):

2.png

六授帕、模式的優(yōu)缺點(diǎn):

橋接模式珊楼,分離抽象與實(shí)現(xiàn)疯坤,其優(yōu)點(diǎn)毋庸置疑抹腿,即靈活的擴(kuò)展以及對(duì)客戶來(lái)說(shuō)透明的是實(shí)現(xiàn)浅浮。但不足之處在于運(yùn)用橋接模式進(jìn)行設(shè)計(jì),是有一定難度的芥映,需多加推敲與研究洲尊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市奈偏,隨后出現(xiàn)的幾起案子坞嘀,更是在濱河造成了極大的恐慌,老刑警劉巖惊来,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姆吭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡唁盏,警方通過(guò)查閱死者的電腦和手機(jī)内狸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厘擂,“玉大人昆淡,你說(shuō)我怎么就攤上這事」粞希” “怎么了昂灵?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)舞萄。 經(jīng)常有香客問(wèn)我眨补,道長(zhǎng),這世上最難降的妖魔是什么倒脓? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任撑螺,我火速辦了婚禮,結(jié)果婚禮上崎弃,老公的妹妹穿的比我還像新娘甘晤。我一直安慰自己,他們只是感情好饲做,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布线婚。 她就那樣靜靜地躺著,像睡著了一般盆均。 火紅的嫁衣襯著肌膚如雪塞弊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音游沿,去河邊找鬼饰抒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奏候,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唇敞,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蔗草,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了疆柔?” 一聲冷哼從身側(cè)響起咒精,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旷档,沒(méi)想到半個(gè)月后模叙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞋屈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年范咨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂庇。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠啊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出权旷,到底是詐尸還是另有隱情替蛉,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布拄氯,位于F島的核電站躲查,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏译柏。R本人自食惡果不足惜镣煮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鄙麦。 院中可真熱鬧怎静,春花似錦、人聲如沸黔衡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盟劫。三九已至夜牡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塘装。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工急迂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蹦肴。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓僚碎,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阴幌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勺阐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容