1. 程式人生 > >1. Java模式(介面卡模式)

1. Java模式(介面卡模式)

今天看了下Java中的介面卡模式,以下就來小做下總結和談談感想,以便日後使用。

首先,先來先講講介面卡。適配就是由“源”到“目標”的適配,而當中連結兩者的關係就是介面卡。它負責把“源”過度到“目標”。舉個簡單的例子,比如有一個“源”是一個物件人,他擁有2種技能分別是說日語和說英語,而某個崗位(目標)需要你同時回說日語、英語、和法語,好了,現在我們的任務就是要將人這個“源”適配的這個崗位中,如何適配呢?顯而易見地我們需要為人新增一個說法語的方法,這樣才能滿足目標的需要。

接著討論如何加說法語這個方法,也許你會說,為什麼不直接在“源”中直接新增方法,我的理解是,適配是為了實現某種目的而為一個源類暫時性的加上某種方法,所以不能破壞原類的結構。同時不這麼做也符合Java的高內聚,低耦合的原理。既然不能直接加,接著我們就來說該怎麼來實現為人這個“源”新增一個方法,而又不破壞“源”的本身結構。

介面卡模式有2種,第一種是“面向類的介面卡模式”,第二種是“面向物件的介面卡模式”。

先說“面向類的介面卡模式”。顧名思義,這類介面卡模式就是主要用於,單一的為某個類而實現適配的這樣一種模式,為什麼說只為某個類去實現,一會提到,我們先展示這種類適配模式的程式碼實現。

源的程式碼如下:

public class Person {  
      
    private String name;  
    private String sex;  
    private int age;  
      
    public void speakJapanese(){  
        System.out.println("I can speak Japanese!");  
    }  
      
    public void speakEnglish(){  
        System.out.println("I can speak English!");  
    }  
    ...//以下省略成員變數的get和set方法  
}  

 目標介面的程式碼如下:

public interface Job {  
      
    public abstract void speakJapanese();  
    public abstract void speakEnglish();  
    public abstract void speakFrench();  
      
}  

 介面卡的程式碼如下:

public class Adapter extends Person implements Job{  
    //可見extends代表將原類功能繼承過來,implements代表將新類賦予新的功能
    public void speakFrench() {  
          
    }  
      
}  

好了,程式碼看完然後要做一些說明了,之前遺留的一個問題,為什麼稱其為類適配模式呢?很顯然的,Adapter類繼承了Person類,而在Java這種單繼承的語言中也就意味著,他不可能再去繼承其他的類了,這樣也就是這個介面卡只為Person這一個類服務。所以稱其為類適配模式。

說完類的適配模式,我們要開始說第2種物件的介面卡模式了。物件介面卡模式是把“源”作為一個物件聚合到介面卡類中。同樣的話不多說,貼上程式碼:

源的程式碼以及目的碼同上,再次不再贅述。

僅貼出介面卡程式碼:

public class Adapter implements Job {  
  
    Person person;  
  
    public Adapter(Person person) {  
        this.person = person;  
    }  
  
    public void speakEnglish() {  
        person.speakEnglish();  
    }  
  
    public void speakJapanese() {  
        person.speakJapanese();  
    }  
  
    //new add  
    public void speakFrench() {  
          
    }  
  
}  

物件的介面卡模式,把“源”作為一個構造引數傳入介面卡,然後執行介面所要求的方法。這種適配模式可以為多個源進行適配。彌補了類適配模式的不足。

現在來對2種適配模式做個分析:

  1. 類的適配模式用於單一源的適配,由於它的源的單一話,程式碼實現不用寫選擇邏輯,很清晰;而物件的適配模式則可用於多源的適配,彌補了類適配模式的不足,使得原本用類適配模式需要寫很多介面卡的情況不復存在,弱點是,由於源的數目可以較多,所以具體的實現條件選擇分支比較多,不太清晰。
  2. 介面卡模式主要用於幾種情況:(1)系統需要使用現有的類,但現有的類不完全符合需要。(2)講彼此沒有太大關聯的類引進來一起完成某項工作(指物件適配)。

 最後,再來順帶談談預設介面卡模式 (MouseAdapter,這個比較簡單):這種模式的核心歸結如下:當你想實現一個介面但又不想實現所有介面方法,只想去實現一部分方法時,就用中預設的介面卡模式,他的方法是在介面和具體實現類中新增一個抽象類,而用抽象類去空實現目標介面的所有方法。而具體的實現類只需要覆蓋其需要完成的方法即可。程式碼如下:

介面類:

public interface Job {  
      
    public abstract void speakJapanese();  
    public abstract void speakEnglish();  
    public abstract void speakFrench();  
    public abstract void speakChinese();  
      
}  

抽象類: 

public abstract class JobDefault implements Job{  
  
    public void speakChinese() {  
          
    }  
  
    public void speakEnglish() {  
          
    }  
  
    public void speakFrench() {  
          
    }  
  
    public void speakJapanese() {  
          
    }  
  
}  

實現類:

public class JobImpl extends JobDefault{  
      
    public void speakChinese(){  
        System.out.println("I can speak Chinese!");  
    }  
      
}  

好了,介面卡模式就先說到這了,希望對自己和大家都有一個提高。