1. 程式人生 > >Java進階篇設計模式之四 -----介面卡模式和橋接模式

Java進階篇設計模式之四 -----介面卡模式和橋接模式

前言

上一篇中我們學習了建立型模式的建造者模式和原型模式。本篇則來學習下結構型模式的介面卡模式和橋接模式。

介面卡模式

簡介

介面卡模式是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。

簡單的來說就是通過某個介面將不相容的兩個類進行相容,俗稱轉換器。
生活比較典型的例子是電器的電壓,美國的電壓是110V左右, 而中國的電壓普片是220V,如果我們想用美國或日本的電器,則需要一個轉換器,將110V轉換成220V。還有一個很典型例子就是曾經的萬能充,基本可以充各種手機的電池。

這裡我們用一個簡單的示例來進行說明。
某個視訊播放器,只能播放MP4格式的視訊,但是主流的視訊格式除了MP4,還有AVI、RVMB等,這時就有個軟體,格式工廠用於對視訊格式的轉換(介面卡),從而進行播放視訊。這時我們就可以使用介面卡模式來進行完成該程式碼的編寫。

介面卡模式主要有兩種型別,一種是類介面卡模式,主要通過繼承來實現介面卡功能;一種是物件介面卡模式,通過組合來實現介面卡功能。

首先是類介面卡模式,它需要完成一下步驟:

  1. 建立MP4、AVI、RVMB視訊格式的介面;
  2. 建立一個視訊播放器的類實現MP4視訊格式的類;
  3. 編寫一個格式工廠類,將AVI、RVMB等格式的視訊檔案轉換成MP4格式的檔案。
  4. 播放這些視訊。

那麼程式碼如下:

程式碼示例:


    interface Mp4{
        void playMp4();
    }
    
    interface Avi{
        void playAvi();
    }
    
    
    interface Rvmb{
        void playRvmb();
    }
    
    class VideoPlayer implements Mp4{
    
        @Override
        public void playMp4() {
            System.out.println("播放Mp4格式的視訊檔案.");
        }
    }
    
    
    class FormatFactory extends VideoPlayer  implements Avi{    
        @Override
        public void playAvi() {
            //轉換成MP4格式的視訊
            playMp4();
        }
    }
    
    
    public static void main(String[] args) {        
            Mp4 mp4=new VideoPlayer();
            mp4.playMp4();
            Avi avi=new FormatFactory();
            avi.playAvi();
    }

執行結果:

    播放Mp4格式的視訊檔案.
    播放Mp4格式的視訊檔案.

通過上述程式碼以及執行結果,我們可以得到想要的結果了,如果還有新增的視訊格式,也需要使用該視訊播放器播放的話,只需在增加一個介面以及格式工廠類就可以了。

物件介面卡模式
通過組合來實現介面卡功能。
所以這裡我們只需將格式工廠中繼承改為建立物件即可。
更改之後的程式碼如下:
程式碼示例


class FormatFactory2  implements Rvmb{
        private Mp4 mp4;
        
         public FormatFactory2(Mp4 mp4) {
            this.mp4=mp4;
        }
        
        @Override
        public void playRvmb() {
            mp4.playMp4();
        }   
    }


    public static void main(String[] args) {
    
            Rvmb rvmb=new FormatFactory2(new VideoPlayer());
            rvmb.playRvmb();
            
    }

執行結果:

    播放Mp4格式的視訊檔案.

這兩種介面卡模式中,都實現了該功能,不過在這裡推薦使用物件介面卡模式,相比類介面卡模式,它更加靈活,也符合設計原則中的合成複用原則:

儘量使用合成/聚合的方式,而不是使用繼承。

介面卡模式的優點:

提升了類的複用和靈活度。

介面卡模式的缺點:

使用過多,系統會比較雜亂,難以把握。

注意事項:

介面卡不是在詳細設計時新增的,而是解決正在服役的專案的問題。

橋接模式

簡介

橋接是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。

字面的意思解讀就是通過一箇中間的橋樑對兩邊的東西進行關聯起來,但是關聯的兩者之間又不相互影響。對這個印象比較深的是<大話設計模式>中的手機品牌和手機軟體,手機有很多品牌,市場有很多軟體,每個手機裝的軟體又各不相同,手機品牌包含包含軟體,但是軟體並不是手機的一部分,它們是聚合關係。如果A品牌手機裝了a,b軟體,B品牌手機裝了b,c軟體,如果A品牌手機需要新安裝一個c軟體,那麼它只需新增該軟體即可,無需知道該軟體是如何生產的。相同的,如果新增了一個C品牌手機,那麼它也只需安裝所需的a、b或c軟體即可。

好了,廢話不在多說,依舊用一個示例來進行說明。
市面上有很多種筆,比如鉛筆、黑色的圓珠筆和紅色的圓珠筆等等, 也有很多種型別的紙,比如考試的卷子用的紙,報紙用的紙等等。一般來說,報紙上的字顏色是黑色的,這裡我們就用黑色的圓珠筆來進行書寫,考試卷子上的打分字顏色是紅色的,這裡我們就用紅色的圓珠筆來進行書寫。筆類和紙類相互獨立,但是在紙上寫字又將它們關聯起來,這裡我們就可以使用橋接模式。

實現步驟如下:

  1. 定義一個筆類的介面,有寫的這個方法;
  2. 定義紅筆和黑筆的類,實現筆類的介面;
  3. 定義一個紙類的抽象類,設定筆的種類,並需要實現被寫的方法;
  4. 定義卷子紙和新聞紙類,繼承紙類並實現該方法;
  5. 進行書寫。

程式碼示例


interface Pen{
    void write();
}

class RedPen implements Pen{
    @Override
    public void write() {
        System.out.println("紅色的字");
    }
}

class BlackPen implements Pen{
    @Override
    public void write() {
        System.out.println("黑色的字");
    }
}


abstract class  Paper{
    protected  Pen pen;
    
    void setPen(Pen pen){
        this.pen=pen;
    }   
    abstract void writing();
}

class ExaminationPaper extends Paper{
    @Override
    void writing() {
        pen.write();
    }
}

class NewsPaper extends Paper{
    @Override
    void writing() {
        pen.write();
    }
}

public static void main(String[] args) {
        Paper paper=new ExaminationPaper();
        paper.setPen(new RedPen());
        paper.writing();
        
        Paper paper2=new NewsPaper();
        paper2.setPen(new BlackPen());
        paper2.writing();
    }

執行結果

紅色的字
黑色的字

從上述結果中我們可以得出我們想要的結果。如果新增一個筆類或者一個紙類,那麼只需新增相應的介面和實現即可,並不會因為結構化改變而相互直接影響。

橋接模式的優點:

1、抽象和實現的分離,實現瞭解耦;
2、提升的擴充套件能力。

橋接模式的缺點:

會使系統看起復雜,對新手不友好,沒有一定的抽象進行設計能力難以理解。

使用場景:

一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。

其它

音樂推薦

網易雲網友評價(ps:原版無法生成外鏈,建議聽原版):

扶桑畫師淺溪,居泰安,喜繪鯉。院前一方荷塘,錦鯉遊曳,溪常與嬉戲。 其時正武德之亂,藩鎮割據,戰事頻仍,魑魅魍魎,肆逆於道。兵戈逼泰安,街鄰皆逃亡,獨溪不捨錦鯉,未去。 是夜,院室倏火。有人入火護溪,言其本鯉中妖,欲取溪命,卻生情愫,遂不忍為之。翌日天明,火勢漸歇,人已不見。

原創不易,如果感覺不錯,希望給個推薦!您的支援是我寫作的最大動力!
版權宣告:
作者:虛無境
部落格園出處:http://www.cnblogs.com/xuwujing
CSDN出處:http://blog.csdn.net/qazwsxpcm    
個人部落格出處:http://www.panchengming.com

相關推薦

Java設計模式 -----適配器模式模式

原則 pub 是我 protect 接口 logs 將不 多說 外鏈 前言 在上一篇中我們學習了創建型模式的建造者模式和原型模式。本篇則來學習下結構型模式的適配器模式和橋接模式。 適配器模式 簡介 適配器模式是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬於結構型模

Java 設計模式 ----- 總結

前言 本篇是講述之前學習設計模式的一個總結篇,其目的是為了對這些設計模式的進行一個提煉總結,能夠通過檢視看此篇就可以理解一些設計模式的核心思想。 設計模式簡介 什麼是設計模式 設計模式是一套被反覆使用的、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。 為什麼使用設計模式 使用

Java設計模式 -----介面卡模式模式

前言 在上一篇中我們學習了建立型模式的建造者模式和原型模式。本篇則來學習下結構型模式的介面卡模式和橋接模式。 介面卡模式 簡介 介面卡模式是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。 簡單的來說就是通過某個介面將不相容的兩個類進行相容,俗稱轉換器。 生活

Java設計模式二 ----- 工廠模式

class computer 社會 進階 輕松 override out 是否 return 前言 在上一篇中我們學習了單例模式,介紹了單例模式創建的幾種方法以及最優的方法。本篇則介紹設計模式中的工廠模式,主要分為簡單工廠模式、工廠方法和抽象工廠模式。 簡單工廠模式 簡單

Java設計模式五-----外觀模式裝飾器模式

和我 logs 適配器模式 del xtra implement () 實例化 網絡遊戲 前言 在上一篇中我們學習了結構型模式的適配器模式和橋接模式。本篇則來學習下結構型模式的外觀模式和裝飾器模式。 外觀模式 簡介 外觀模式隱藏系統的復雜性,並向客戶端提供了一個客戶端可以

Java設計模式六 ----- 組合模式過濾器模式

對組 www. 希望 als oid block 個人 定義 lsi 前言 在上一篇中我們學習了結構型模式的外觀模式和裝飾器模式。本篇則來學習下組合模式和過濾器模式。 組合模式 簡介 組合模式是用於把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表

Java設計模式八 ----- 責任鏈模式命令模式

如果能 clean branch pcm tle 開始 類型 mar www 前言 在上一篇中我們學習了結構型模式的享元模式和代理模式。本篇則來學習下行為型模式的兩個模式, 責任鏈模式(Chain of Responsibility Pattern)和命令模式(Comman

Java設計模式九----- 解釋器模式叠代器模式

簡單 目的 java進階 使用 記錄 ace 客戶端 -- pro 前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 解釋器模

Java設計模式十 ---- 訪問者模式中介者模式

前言 在上一篇中我們學習了結構型模式的直譯器模式(Interpreter Pattern)和迭代器模式(Iterator Pattern)。本篇則來學習下行為型模式的兩個模式,訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。 訪問者模式 簡介 訪問者

Java設計模式十一 ---- 策略模式模板方法模式

前言 在上一篇中我們學習了行為型模式的訪問者模式(Visitor Pattern)和中介者模式(Mediator Pattern)。本篇則來學習下行為型模式的兩個模式,策略模式(Strategy Pattern)和模板模式(Mediator Pattern)。 策略模式 簡介 策略模式(Stra

Java設計模式十二 ---- 備忘錄模式狀態模式

前言 在上一篇中我們學習了行為型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern)。本篇則來學習下行為型模式的兩個模式,備忘錄模式(Memento Pattern)和狀態模式(Memento Pattern)。 備忘錄模式 簡介 備忘錄模式(Meme

Java設計模式七 ----- 享元模式代理模式

前言 在上一篇中我們學習了結構型模式的組合模式和過濾器模式。本篇則來學習下結構型模式最後的兩個模式, 享元模式和代理模式。 享元模式 簡介 享元模式主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。這種型別的設計模式屬於結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式。 用通俗的話來

Java設計模式九----- 直譯器模式迭代器模式

前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 直譯器模式(Interpreter Pattern)和迭代器模式

Java設計模式三 ----- 建造者模式原型模式

前言 在上一篇中我們學習了工廠模式,介紹了簡單工廠模式、工廠方法和抽象工廠模式。本篇則介紹設計模式中屬於建立型模式的建造者模式和原型模式。 建造者模式 簡介 建造者模式是屬於建立型模式。建造者模式使用多個簡單的物件一步一步構建成一個複雜的物件。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式

Java設計模式之一 ----- 單例模式

前言 在剛學程式設計沒多久就聽說過設計模式的大名,不過由於當時還是個徹徹底底的菜鳥,並沒有去觸碰。直到在開始工作中對簡單的業務程式碼較為熟悉之後,才正式的接觸設計模式。當時最早接觸的設計模式是工廠模式,不過本文講的是單例模式,這裡就留著下篇文章中在講解。至於為什麼先講解單例模式? 那是因為單例模式是設計模式中

Java十五 ----- JDK1.8的Lambda、Stream日期的使用詳解(很詳細)

前言 本篇主要講述是Java中JDK1.8的一些新語法特性使用,主要是Lambda、Stream和LocalDate日期的一些使用講解。 Lambda Lambda介紹 Lambda 表示式(lambda expression)是一個匿名函式,Lambda表示式基於數學中的λ演算得名,直接對應於

Java設計模式 ----- 適配器模式模式

ted 安裝 解決 適配器 ride out java設計 key void 前言 在上一篇中我們學習了創建型模式的建造者模式和原型模式。本篇則來學習下結構型模式的適配器模式和橋接模式。 適配器模式 簡介 適配器模式是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬於

Java學習第三十天(WebService)

一、WebService介紹 1、使用場景 ① 不同的移動客戶端訪問 ② 需要訪問第三方的專案 2、ISO的七層模型:物理層、資料鏈路層、網路層、傳輸層、表示層、會話層、應用層 3、基於Socket建立Web服務 ① Socket通訊的服務端,實現大小寫轉化 publ

Java(五)——Java的I/O技術

  程式中,為了永久的儲存建立的資料,需要將其儲存在磁碟檔案中,以便在其它程式中使用它們。Java的I/O技術可以將資料儲存到文字檔案、二進位制檔案甚至是ZIP壓縮檔案中,以達到永久性儲存資料的要求。   本篇我們要介紹的內容就是Java的I/O技術,即輸入/輸出。 一、輸入/輸出流   流是一組有序的資料序

:優先順序佇列PriorityBlockingQueue(十五)

今天我們來講下PriorityBlockingQueue這個佇列,它是一個優先順序佇列,什麼是優先順序呢?意思就是我們可以定義佇列中哪個元素可以先被取出! 它與前面介紹的LinkedBlockingQueue不同的地方就是,它是可以定義優先順序的!且入隊的元素必須實現Com