Java設計模式之《適配器模式》及應用場景

轉自https://www.cnblogs.com/V1haoge/p/6479118.htmlhtml

適配器就是一種適配中間件,它存在於不匹配的兩者之間,用於鏈接兩者,將不匹配變得匹配,簡單點理解就是日常所見的轉接頭,轉換器之類的存在。ide

  適配器模式有兩種:類適配器、對象適配器、接口適配器測試

  前兩者在實現上有些許區別,做用同樣,第三個接口適配器差異較大。this

一、類適配器模式:url

  原理:經過繼承來實現適配器功能。spa

  當咱們要訪問的接口A中沒有咱們想要的方法 ,卻在另外一個接口B中發現了合適的方法,咱們又不能改變訪問接口A,在這種狀況下,咱們能夠定義一個適配器p來進行中轉,這個適配器p要實現咱們訪問的接口A,這樣咱們就能繼續訪問當前接口A中的方法(雖然它目前不是咱們的菜),而後再繼承接口B的實現類BB,這樣咱們能夠在適配器P中訪問接口B的方法了,這時咱們在適配器P中的接口A方法中直接引用BB中的合適方法,這樣就完成了一個簡單的類適配器。.net

  詳見下方實例:咱們以ps2與usb的轉接爲例設計

ps2接口:Ps2code

1 public interface Ps2 { 2 void isPs2(); 3 }

USB接口:Usbhtm

1 public interface Usb { 2 void isUsb(); 3 }

USB接口實現類:Usber

複製代碼
1 public class Usber implements Usb { 2 3  @Override 4 public void isUsb() { 5 System.out.println("USB口"); 6  } 7 8 }
複製代碼

適配器:Adapter

複製代碼
1 public class Adapter extends Usber implements Ps2 { 2 3  @Override 4 public void isPs2() { 5  isUsb(); 6  } 7 8 }
複製代碼

測試方法:Clienter

複製代碼
1 public class Clienter { 2 3 public static void main(String[] args) { 4 Ps2 p = new Adapter(); 5  p.isPs2(); 6  } 7 8 }
複製代碼

顯示結果:

USB口

實例講解:

  我手中有個ps2插頭的設備,可是主機上只有usb插頭的插口,怎麼辦呢?弄個轉換器,將ps2插頭轉換成爲USB插頭就可使用了。

  接口Ps2:描述ps2接口格式

  接口Usb:描述USB接口格式

  類Usber:是接口Usb的實現類,是具體的USB接口格式

  Adapter:用於將ps2接口格式轉換成爲USB接口格式

二、對象適配器模式

  原理:經過組合來實現適配器功能。

  當咱們要訪問的接口A中沒有咱們想要的方法 ,卻在另外一個接口B中發現了合適的方法,咱們又不能改變訪問接口A,在這種狀況下,咱們能夠定義一個適配器p來進行中轉,這個適配器p要實現咱們訪問的接口A,這樣咱們就能繼續訪問當前接口A中的方法(雖然它目前不是咱們的菜),而後在適配器P中定義私有變量C(對象)(B接口指向變量名),再定義一個帶參數的構造器用來爲對象C賦值,再在A接口的方法實現中使用對象C調用其來源於B接口的方法。

  詳見下方實例:咱們仍然以ps2與usb的轉接爲例

ps2接口:Ps2

1 public interface Ps2 { 2 void isPs2(); 3 }

USB接口:Usb

1 public interface Usb { 2 void isUsb(); 3 }

USB接口實現類:Usber

複製代碼
1 public class Usber implements Usb { 2 3  @Override 4 public void isUsb() { 5 System.out.println("USB口"); 6  } 7 8 }
複製代碼

適配器:Adapter

複製代碼
 1 public class Adapter implements Ps2 {  2  3 private Usb usb;  4 public Adapter(Usb usb){  5 this.usb = usb;  6  }  7  @Override  8 public void isPs2() {  9  usb.isUsb(); 10  } 11 12 }
複製代碼

測試類:Clienter

複製代碼
1 public class Clienter { 2 3 public static void main(String[] args) { 4 Ps2 p = new Adapter(new Usber()); 5  p.isPs2(); 6  } 7 8 }
複製代碼

結果顯示:

USB口

實例講解:

  我手中有個ps2插頭的設備,可是主機上只有usb插頭的插口,怎麼辦呢?弄個轉換器,將ps2插頭轉換成爲USB插頭就可使用了。

  接口Ps2:描述ps2接口格式

  接口Usb:描述USB接口格式

  類Usber:是接口Usb的實現類,是具體的USB接口格式

  Adapter:用於將ps2接口格式轉換成爲USB接口格式

三、接口適配器模式

  原理:經過抽象類來實現適配,這種適配稍別於上面所述的適配。

  當存在這樣一個接口,其中定義了N多的方法,而咱們如今卻只想使用其中的一個到幾個方法,若是咱們直接實現接口,那麼咱們要對全部的方法進行實現,哪怕咱們僅僅是對不須要的方法進行置空(只寫一對大括號,不作具體方法實現)也會致使這個類變得臃腫,調用也不方便,這時咱們可使用一個抽象類做爲中間件,即適配器,用這個抽象類實現接口,而在抽象類中全部的方法都進行置空,那麼咱們在建立抽象類的繼承類,並且重寫咱們須要使用的那幾個方法便可。

目標接口:A

複製代碼
1 public interface A { 2 void a(); 3 void b(); 4 void c(); 5 void d(); 6 void e(); 7 void f(); 8 }
複製代碼

適配器:Adapter

複製代碼
1 public abstract class Adapter implements A { 2 public void a(){} 3 public void b(){} 4 public void c(){} 5 public void d(){} 6 public void e(){} 7 public void f(){} 8 }
複製代碼

實現類:Ashili

複製代碼
1 public class Ashili extends Adapter { 2 public void a(){ 3 System.out.println("實現A方法被調用"); 4  } 5 public void d(){ 6 System.out.println("實現d方法被調用"); 7  } 8 }
複製代碼

測試類:Clienter

複製代碼
1 public class Clienter { 2 3 public static void main(String[] args) { 4 A a = new Ashili(); 5  a.a(); 6  a.d(); 7  } 8 9 }
複製代碼

四、適配器模式應用場景

類適配器與對象適配器的使用場景一致,僅僅是實現手段稍有區別,兩者主要用於以下場景:

  (1)想要使用一個已經存在的類,可是它卻不符合現有的接口規範,致使沒法直接去訪問,這時建立一個適配器就能間接去訪問這個類中的方法。

  (2)咱們有一個類,想將其設計爲可重用的類(可被多處訪問),咱們能夠建立適配器來將這個類來適配其餘沒有提供合適接口的類。

  以上兩個場景其實就是從兩個角度來描述一類問題,那就是要訪問的方法不在合適的接口裏,一個從接口出發(被訪問),一個從訪問出發(主動訪問)。

接口適配器使用場景:

  (1)想要使用接口中的某個或某些方法,可是接口中有太多方法,咱們要使用時必須實現接口並實現其中的全部方法,可使用抽象類來實現接口,並不對方法進行實現(僅置空),而後咱們再繼承這個抽象類來經過重寫想用的方法的方式來實現。這個抽象類就是適配器。

相關文章
相關標籤/搜索