1. 程式人生 > >橋接模式-解決多維度變化的問題

橋接模式-解決多維度變化的問題

橋接模式定義

將抽象和實現放在兩個不同的類層次結構中,使得兩者可以獨立變化。

橋接模式結構圖

在這裡插入圖片描述

橋接模式角色介紹

抽象化角色:Abstraction,用於定義抽象類的介面,同時定義了一個Implementor(實現化介面)型別的物件。

擴充抽象類角色:RefinedAbstraction,繼承抽象類,它實現了在Abstraction中宣告的抽象業務方法,在RefinedAbstraction中可以呼叫在Implementor中定義的業務方法。

實現化介面角色:Implementor,一個介面或者抽象類,定義實現化類層次結構行為。

具體實現類角色:ConcreteImplementor,實現Implementor介面,在不同的ConcreteImplementor中提供基本操作的不同實現。

橋接模式結構程式碼

實現化角色:

public interface Implementor {
    void operationImp();
}

具體實現類角色:

public class ConcreteImplementor implements Implementor {
    public void operationImp() {
        System.out.println("我是實現化層次結構的功能");
    }
}

抽象化角色:

public abstract class Abstraction {
    protected Implementor implementor;
    public Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    public abstract void operation();

    public abstract void doSometing();
}

擴充抽象類角色:

public class RefinedAbstraction extends Abstraction {

    public RefinedAbstraction(Implementor implementor){
        super(implementor);
    }

    public void operation() {
        implementor.operationImp();
    }

    public void doSometing() {
        System.out.println("doSometiongnvnvnnnnvnnv");
    }
}

橋接模式執行機制

先說一下類的多維度變化,類的多維度也就是類具有的多個屬性,每個屬性的差異都通過子類繼承的方式實現,各個屬性之間就會相互干擾,不需要變化的屬性要隨變化的屬性擴張到各個子類中。

橋接模式就是把類的多個屬性按照屬性維度進行拆分到不同的類中,每個類只負責一個屬性變化。選擇其中一個屬性作為抽象類層次結構,其它作為實現類層次結構。抽象類層次結構與實現類層次結構屬於聚合關聯關係。

那拆分過程誰作為抽象類層次結構、誰作為實現類層次結構呢?我總結了兩個原則:
1、把直接與客戶端對接的屬性作為抽象類層次結構,間接對接的屬性作為實現類層次結構。比如客戶端使用遙控器操作電視,遙控器種類不同,電視種類也不同,但客戶端直接操作的是遙控器,此時把遙控器這個類層次結構作為抽象層次結構,把電視機作為實現類層次結構。
2、把差異性數量最少的屬性作為抽象類層次結構。比如客戶選擇咖啡的種類和咖啡杯子的型號,明顯杯子型號這個屬性差異性數量少於咖啡種類這個屬性差異性。所以此時把咖啡杯子的型號作為抽象類層次結構,把咖啡種類作為實現類層次結構。

橋接模式解決的核心問題

橋接模式解決的是類屬性多維度變化問題,把類的抽象層次結構和類的實現層級結構解耦,這個解耦主要指的是子類繼承層面,通過組合的形式,實現各個屬性類可以獨立變化。