一天一種設計模式之十三-----橋接模式

一.橋接模式簡介

  1. 橋接模式屬於結構型模式。java

  2. 定義:將抽象部分與他的實現部分分離,使他們均可以獨立的變化。ide

  3. 面向對象設計中,咱們還有一個重要的設計原則,就是合成/聚合複用原則,即優先使用對象合成/聚合,而不是類繼承。這樣作的好處是有助於你保持每一個類被封裝和集中。(橋接模式符合該設計原則)
    測試

    1. 聚合表示一種弱的‘擁有關係’,體現的是A對象能夠包含B對象,但B對象不是A對象的一部分。this

    2. 合成則是一種強的‘擁有關係’,體現了嚴格的部分和總體關係,部分和總體的聲明週期同樣。
      spa

  4. 適用性:設計

    1. 你不但願在抽象和他的實現部分之間有一個固定的綁定關係。例如這種狀況多是由於,在程序運行時刻實現部分應能夠被選擇或者切換。指針

    2. 類的抽象以及他的實現都應該能夠經過生成子類的方法加以擴充。這時bridge模式使你能夠對不一樣的抽象接口和實現部分進行組合,並對他們進行擴充。code

    3. 對一個抽象的實現部分的修改應對客戶不產生影響,即客戶的代碼沒必要從新編譯。對象

    4. 有許多子類要生成,這樣一種類層次結構說明你必須將一個對象分紅兩個部分。繼承

    5. 想在多個對象間共享實現,但同時要求客戶並不知道這一點。

  5. 結構

    1. Abstraction  定義抽象類的接口。維護一個紙箱Implementor類型對象的指針。

    2. RefinedAbstraction 擴充由Abstraction定義的接口。

    3. Implementor 定義實現類的接口,該接口不必定要與Abstraction的接口徹底一致。


二.測試代碼

    1.下述代碼中,人和clothing就是一種聚合關係。

  2.而人和男人不是一種合成關係。男人和type是一種合成關係(不太肯定,求大神解惑)。

public class QiaojiemoshiTest3 {
    public static void main(String[] args) {
        Clothing clothing=new Trouser();
        Person person=new Man();
        person.setClothing(clothing);
        person.dress();
    }
}
abstract class Clothing{
    public abstract void personDressCloth(Person person);
}
abstract class Person{
    private Clothing clothing;
    private String type;
    public Clothing getClothing() {
        return clothing;
    }
    public void setClothing(Clothing clothing) {
        this.clothing = clothing;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public abstract void dress();
}
class Man extends Person{
    public Man(){
        setType("男人");
    }
    @Override
    public void dress() {
        Clothing clothing=getClothing();
        clothing.personDressCloth(this);
    }
    
}
class Women extends Person{
    //....
    @Override
    public void dress() {
    }
}
class Trouser extends Clothing{
    @Override
    public void personDressCloth(Person person) {
        System.out.println(person.getType()+"穿褲子");
    }
    
}
class Dress extends Clothing{
    @Override
    public void personDressCloth(Person person) {
        System.out.println(person.getType()+"穿裙子");
    }
    
}
相關文章
相關標籤/搜索