1. 程式人生 > >Java設計模式之《介面卡模式》及應用場景

Java設計模式之《介面卡模式》及應用場景

  介面卡就是一種適配中介軟體,它存在於不匹配的二者之間,用於連線二者,將不匹配變得匹配,簡單點理解就是平常所見的轉接頭,轉換器之類的存在。

  介面卡模式有兩種:類介面卡、物件介面卡、介面介面卡

  前二者在實現上有些許區別,作用一樣,第三個介面介面卡差別較大。

1、類介面卡模式:

  原理:通過繼承來實現介面卡功能。

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

  詳見下方例項:我們以ps2與usb的轉接為例

ps2介面:Ps2

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

USB介面:Usb

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

USB介面實現類:Usber

按 Ctrl+C 複製程式碼

按 Ctrl+C 複製程式碼

介面卡: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介面格式

2、物件介面卡模式

  原理:通過組合來實現介面卡功能。

  當我們要訪問的介面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介面格式

3、介面介面卡模式

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

  當存在這樣一個介面,其中定義了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 }

複製程式碼

4、介面卡模式應用場景

類介面卡與物件介面卡的使用場景一致,僅僅是實現手段稍有區別,二者主要用於如下場景:

  (1)想要使用一個已經存在的類,但是它卻不符合現有的介面規範,導致無法直接去訪問,這時建立一個介面卡就能間接去訪問這個類中的方法。

  (2)我們有一個類,想將其設計為可重用的類(可被多處訪問),我們可以建立介面卡來將這個類來適配其他沒有提供合適介面的類。

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

介面介面卡使用場景:

  (1)想要使用介面中的某個或某些方法,但是介面中有太多方法,我們要使用時必須實現介面並實現其中的所有方法,可以使用抽象類來實現介面,並不對方法進行實現(僅置空),然後我們再繼承這個抽象類來通過重寫想用的方法的方式來實現。這個抽象類就是介面卡。