二十三種設計模式-橋樑模式

主要的作用

將抽象與實現解耦,可以讓抽象和實現獨立的變化。


關鍵角色

關鍵角色
(1)Abstraction:抽象角色,這個角色提供的接口是面向調用方的,其中會保持一個對實現化對象的引用,其中的真正實現就是由Implementor的實現類來提供的,Implementor就相當於一個橋樑,將抽象角色和具體的實現關聯了起來,使用組合的方式,而不是繼承的方式。

(2)RefinedAbstraction:修正抽象化角色,主要是Abstraction這個抽象角色可能沒有提供過多的接口,可以通過RefinedAbstraction來擴展功能。

(3)Implementor:實現化角色,這個角色就是相當於一個橋樑,只給出接口而不給出具體的實現。

(4)具體實現化角色:就是Implementor這個接口的實現類,實現類纔是真正提供功能的地方。


案例

  • 案例一:自定義demo
public class BridgeBase {

    private static Abstractor abstractor;

    /**
     * 抽象化角色
     */
    static abstract class Abstractor {

        // 通過聚合模式保持對實現化角色的引用
        private Implementer implementer;

        public Abstractor(Implementer implementer) {
            this.implementer = implementer;
        }

        abstract void print();

        public Implementer getImplementer() {
            return implementer;
        }
    }


    /**
     * 實現化角色
     */
    static abstract class Implementer {
        abstract String say(String s);
    }

    static class HiAbstractor extends Abstractor {

        public HiAbstractor(Implementer implementer) {
            super(implementer);
        }

        @Override
        void print() {
            System.out.println("hi" + getImplementer().say("zzz"));
        }
    }

    static class HelloAbstractor extends Abstractor {

        public HelloAbstractor(Implementer implementer) {
            super(implementer);
        }

        @Override
        void print() {
            System.out.println("hello" + getImplementer().say(" what?"));
        }
    }

    static class LowImplementer extends Implementer {
        @Override
        String say(String s) {
            return s + " GG";
        }
    }

    static class HighImplementer extends Implementer {
        @Override
        String say(String s) {
            return s  + "MM";
        }
    }

    public static void main(String[] args) {
        Abstractor abstractor = new HelloAbstractor(new LowImplementer());
        abstractor.print();
    }
}
  • 案例二:JDBC的連接的設計
    橋樑模式

Driver是相當於一個橋樑,對於mysql、oracle等數據庫實現肯定是不一樣的,只需要基於Driver提供不同的實現類即可。將抽象和實現解耦。

public class Driver extends NonRegisteringDriver implements java.sql.Driver {
    public Driver() throws SQLException {
    }

    static {
        try {
            DriverManager.registerDriver(new Driver());
        } catch (SQLException var1) {
            throw new RuntimeException("Can't register driver!");
        }
    }
}

上面就是mysql提供的基於Driver橋樑的一個實現類。

其實好好想想,感覺面向接口編程都有着一絲絲橋樑模式的影子。比如依賴於spring的依賴注入功能,就是根據需要提供不同的實現,能夠將抽閒和實現解耦了。

這裏先簡單介紹下橋樑模式,等後面我把每種設計模式都理解清楚了,再一起總結下。

再次說明一下,這個模式的關鍵在於能夠將抽象和實現解耦。就像是一個公司,中臺負責搭架子,不同的業務提供具體的實現,這樣就不需要把過重的業務完全放到中臺了,中臺就可以提供一些通用性的功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章