1. 程式人生 > >Java設計模式之橋接模式

Java設計模式之橋接模式

合成/聚合複用原則:儘量使用合成/聚合,儘量不要使用類繼承。聚合表示一種弱的 ‘擁有’ 關係,體現A物件可以包含B物件,但B物件不是A物件的一部分;合成則是一種強的‘擁有’ 關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣,比方說雁有兩個翅膀,翅膀與大雁是部分與整體的關係,並且它們的生命週期是相同的,於是大雁和翅膀就是合成關係,而大雁是群居動物,所以每隻大雁都是屬於一個雁群,一個雁群可以有多隻大雁,所以大雁和雁群是聚合關係。

橋接模式(Bridge):將抽象部分與它的實現部分分離,使他們都可以獨立地變化。


實現類:

public abstract class Implementor {
    public abstract void operation();
}
class ConcreteImplemtorA extends Implementor {
    @Override
    public void operation() {
        System.out.println("ConcreteImplemtorA的方法執行");
    }
}
class ConcreteImplemtorB extends Implementor {
    @Override
    public void operation() {
        System.out.println("ConcreteImplemtorB的方法執行");
    }
}
抽象類:
public abstract class Abstraction {
    protected Implementor implementor;// 橋接模式的關鍵,使得Abstraction聚合Implementor
    private String name;

    public Abstraction(String name) {
        this.setName(name);
    }

    public void setImplementor(Implementor implementor) {
        this.implementor = implementor;
    }

    public void operation() {
        System.out.print("Abstraction-" + this.getName() + ": ");
        implementor.operation();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class AbstractionA extends Abstraction {

    public AbstractionA(String name) {
        super(name);
    }

    @Override
    public void operation() {
        super.operation();
    }
}

class AbstractionB extends Abstraction {

    public AbstractionB(String name) {
        super(name);
    }

    @Override
    public void operation() {
        super.operation();
    }
}
客戶端:
public class BridgeClient {//客戶端
    public static void main(String[] args) {
        Abstraction a = new AbstractionA("A");
        a.setImplementor(new ConcreteImplemtorA());
        a.operation();
        a.setImplementor(new ConcreteImplemtorB());
        a.operation();

        Abstraction b = new AbstractionB("B");
        b.setImplementor(new ConcreteImplemtorA());
        b.operation();
        b.setImplementor(new ConcreteImplemtorB());
        b.operation();

        // 這樣通過使用“組合/聚合複用原則”
        // 如果繼續有AbstractionC ... 或者ConcreteImplemtorC ...
        // 只需要擴充套件類即可,不需要修改現有類,符合“開放-封閉”原則
    }
}
執行結果:
Abstraction-A: ConcreteImplemtorA的方法執行
Abstraction-A: ConcreteImplemtorB的方法執行
Abstraction-B: ConcreteImplemtorA的方法執行
Abstraction-B: ConcreteImplemtorB的方法執行
可以把每個分類獨立粗來,讓它們各自變化,再使用聚合關係將它們聯絡起來。這種模式就是聚合模式。

應用場合:

當實現系統可能有多個角度分類,每一種分類都有可能變化,那麼就把這種多角度分離出來讓它們獨立變化,減少它們之間的耦合,也就是說,在發現我們需要多角度去分類實現物件的時候,就應該考慮用橋接模式了。