這篇文章帶給大家的內容是關於Java設計模式中適配器模式和橋接模式的介紹(程式碼範例) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
在上一篇中我們學習了創建型模式的建造者模式和原型模式。本篇則來學習下結構型模式的適配器模式和橋接模式。
簡介
適配器模式是作為兩個不相容的介面之間的橋樑。這種類型的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。
簡單的來說就是透過某個介面將不相容的兩個類別相容,俗稱轉換器。
生活比較典型的例子是電器的電壓,美國的電壓是110V左右, 而中國的電壓普片是220V,如果我們想用美國或日本的電器,則需要一個轉換器,將110V轉換成220V 。還有一個很典型例子就是曾經的萬能充,基本上可以充各種手機的電池。
這裡我們用一個簡單的範例來進行說明。
某個視頻播放器,只能播放MP4格式的視頻,但是主流的視頻格式除了MP4,還有AVI、RVMB等,這時就有個軟體,格式工廠用於對視頻格式的轉換(適配器),從而進行播放影片。這時我們就可以使用適配器模式來進行完成該程式碼的編寫。
適配器模式主要有兩種類型,一種是類別適配器模式,主要透過繼承來實現適配器功能;一種是物件適配器模式,透過組合來實現適配器功能。
首先是類別適配器模式,它需要完成步驟:
建立MP4、AVI、RVMB視訊格式的介面;
建立一個視訊播放器的類別實作MP4視訊格式的類別;
#編寫一個格式工廠類,將AVI、RVMB等格式的視訊文件轉換成MP4格式的檔案。
播放這些影片。
那麼程式碼如下:
程式碼範例:
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格式的视频文件.
這兩種適配器模式中,都實現了該功能,不過在這裡推薦使用物件適配器模式,相較於類別適配器模式,它更加靈活,也符合設計原則中的合成復用原則:
盡量使用合成/聚合的方式,而不是使用繼承。
適配器模式的優點:
提升了類別的重複使用和靈活度。
適配器模式的缺點:
使用過多,系統會比較雜亂,難以掌握。
注意事項:
適配器不是在詳細設計時新增的,而是解決正在服役的項目的問題。
簡介
橋接是用來把抽象化與實作化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構型模式,它透過提供抽象化和實作化之間的橋接結構,來實現二者的解耦。
字面的意思解讀就是透過一個中間的橋樑對兩邊的東西進行關聯起來,但是關聯的兩者之間又不相互影響。對這個印像比較深的是4afb97db35735f23dd0d32f7f965d043
中的手機品牌和手機軟體,手機有很多品牌,市場有很多軟體,每個手機裝的軟體又各不相同,手機品牌包含包含軟體,但是軟體並不是手機的一部分,它們是聚合關係。如果A品牌手機裝了a,b軟體,B品牌手機裝了b,c軟體,如果A品牌手機需要新安裝一個c軟體,那麼它只需添加該軟體即可,無需知道該軟體是如何生產的。相同的,如果新增了一個C品牌手機,那麼它也只需安裝所需的a、b或c軟體即可。
好了,廢話不在多說,依舊用一個例子來進行說明。
市面上有很多種筆,像是鉛筆、黑色的原子筆和紅色的原子筆等等, 也有很多種類型的紙,像是考試的捲子用的紙,報紙用的紙等等。一般來說,報紙上的字顏色是黑色的,這裡我們就用黑色的原子筆來進行書寫,考試卷子上的打分字顏色是紅色的,這裡我們就用紅色的原子筆來進行書寫。筆類和紙類相互獨立,但是在紙上寫字又將它們關聯起來,這裡我們就可以使用橋接模式。
实现步骤如下:
定义一个笔类的接口,有写的这个方法;
定义红笔和黑笔的类,实现笔类的接口;
定义一个纸类的抽象类,设置笔的种类,并需要实现被写的方法;
定义卷子纸和新闻纸类,继承纸类并实现该方法;
进行书写。
代码示例
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、提升的扩展能力。
桥接模式的缺点:
会使系统看起复杂,对新手不友好,没有一定的抽象进行设计能力难以理解。
使用场景:
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
相关推荐:
以上是Java設計模式中適配器模式和橋接模式的介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!