Java模式(適配器模式)

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

 

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

 

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

 

適配器模式有2種,第一種是“面向類的適配器模式”,第二種是“面向對象的適配器模式”。

 

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

 

源的代碼如下:

[c-sharp] view plaincopy

  1. public class Person {  

  2.       

  3.     private String name;  

  4.     private String sex;  

  5.     private int age;  

  6.       

  7.     public void speakJapanese(){  

  8.         System.out.println("I can speak Japanese!");  

  9.     }  

  10.       

  11.     public void speakEnglish(){  

  12.         System.out.println("I can speak English!");  

  13.     }  

  14.     ...//以下省略成員變量的get和set方法  

  15. }  

 

 目標接口的代碼如下:

[c-sharp] view plaincopy

  1. public interface Job {  

  2.       

  3.     public abstract void speakJapanese();  

  4.     public abstract void speakEnglish();  

  5.     public abstract void speakFrench();  

  6.       

  7. }  

 適配器的代碼如下:

[c-sharp] view plaincopy

  1. public class Adapter extends Person implements Job{  

  2.   

  3.     public void speakFrench() {  

  4.           

  5.     }  

  6.       

  7. }  

 

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

 

說完類的適配模式,我們要開始說第2種對象的適配器模式了。對象適配器模式是把“源”作爲一個對象聚合到適配器類中。同樣的話不多說,貼上代碼:

 

源的代碼以及目標代碼同上,再次不再贅述。

僅貼出適配器代碼:

[c-sharp] view plaincopy

  1. public class Adapter implements Job {  

  2.   

  3.     Person person;  

  4.   

  5.     public Adapter(Person person) {  

  6.         this.person = person;  

  7.     }  

  8.   

  9.     public void speakEnglish() {  

  10.         person.speakEnglish();  

  11.     }  

  12.   

  13.     public void speakJapanese() {  

  14.         person.speakJapanese();  

  15.     }  

  16.   

  17.     //new add  

  18.     public void speakFrench() {  

  19.           

  20.     }  

  21.   

  22. }  

 

對象的適配器模式,把“源”作爲一個構造參數傳入適配器,然後執行接口所要求的方法。這種適配模式可以爲多個源進行適配。彌補了類適配模式的不足。

 

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

1.類的適配模式用於單一源的適配,由於它的源的單一話,代碼實現不用寫選擇邏輯,很清晰;而對象的適配模式則可用於多源的適配,彌補了類適配模式 的不足,使得原本用類適配模式需要寫很多適配器的情況不復存在,弱點是,由於源的數目可以較多,所以具體的實現條件選擇分支比較多,不太清晰。

2.適配器模式主要用於幾種情況:(1)系統需要使用現有的類,但現有的類不完全符合需要。(2)講彼此沒有太大關聯的類引進來一起完成某項工作(指對象適配)。

 

最後,再來順帶談談默認適配器模式:這種模式的核心歸結如下:當你想實現一個接口但又不想實現所有接口方法,只想去實現一部分方法時,就用中默認的 適配器模式,他的方法是在接口和具體實現類中添加一個抽象類,而用抽象類去空實現目標接口的所有方法。而具體的實現類只需要覆蓋其需要完成的方法即可。代 碼如下:

接口類:

[c-sharp] view plaincopy

  1. public interface Job {  

  2.       

  3.     public abstract void speakJapanese();  

  4.     public abstract void speakEnglish();  

  5.     public abstract void speakFrench();  

  6.     public abstract void speakChinese();  

  7.       

  8. }  

抽象類: 

[c-sharp] view plaincopy

  1. public abstract class JobDefault implements Job{  

  2.   

  3.     public void speakChinese() {  

  4.           

  5.     }  

  6.   

  7.     public void speakEnglish() {  

  8.           

  9.     }  

  10.   

  11.     public void speakFrench() {  

  12.           

  13.     }  

  14.   

  15.     public void speakJapanese() {  

  16.           

  17.     }  

  18.   

  19. }  

實現類:

[c-sharp] view plaincopy

  1. public class JobImpl extends JobDefault{  

  2.       

  3.     public void speakChinese(){  

  4.         System.out.println("I can speak Chinese!");  

  5.     }  

  6.       

  7. }  

 

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



源鏈接Java模式(適配器模式)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章