Java設計模式之 — 適配器(Adapter)

轉載請註明出處:http://blog.csdn.net/guolin_blog/article/details/9400141java

 

今天一大早,你的leader就匆匆忙忙跑過來找到你:「快,快,緊急任務!最近ChinaJoy立刻就要開始了,老闆要求提供一種直觀的方式,能夠查看到咱們新上線的遊戲中每一個服的在線人數。」架構

 

你看了看日期,不是吧!這哪裏是立刻要開始了,分明是已經開始了!這怎麼可能來得及呢?app

 

「不要緊的。」你的leader安慰你道:「功能其實很簡單的,接口都已經提供好了,你只須要調用一下就好了。」ide

 

好吧,你勉爲其難地接受了,對於這種突如其來的新需求,你早已習慣。學習

 

你的leader向你具體描述了一下需求,大家的遊戲目前有三個服,一服已經開放一段時間了,二服和三服都是新開的服。設計的接口很是輕便,你只須要調用Utility.getOnlinePlayerCount(int),傳入每一個服對應的數值就能夠獲取到相應服在線玩家的數量了,如一服傳入1,二服傳入2,三服則傳入3。若是你傳入了一個不存在的服,則會返回-1。而後你只要將獲得的數據拼裝成XML就好,具體的顯示功能由你的leader來完成。ui

 

好吧,聽起來功能並非很複雜,若是如今就開始動工好像還來得及,因而你立刻敲起了代碼。spa

 

首先定義一個用於統計在線人數的接口PlayerCount,代碼以下:.net

[java] view plain copy
 
  1. public interface PlayerCount {  
  2.   
  3.     String getServerName();  
  4.   
  5.     int getPlayerCount();  
  6.   
  7. }  

接着定義三個統計類實現了PlayerCount接口,分別對應了三個不一樣的服,以下所示:架構設計

[java] view plain copy
 
  1. public class ServerOne implements PlayerCount {  
  2.   
  3.     @Override  
  4.     public String getServerName() {  
  5.         return "一服";  
  6.     }  
  7.   
  8.     @Override  
  9.     public int getPlayerCount() {  
  10.         return Utility.getOnlinePlayerCount(1);  
  11.     }  
  12.   
  13. }  
[java] view plain copy
 
  1. public class ServerTwo implements PlayerCount {  
  2.   
  3.     @Override  
  4.     public String getServerName() {  
  5.         return "二服";  
  6.     }  
  7.   
  8.     @Override  
  9.     public int getPlayerCount() {  
  10.         return Utility.getOnlinePlayerCount(2);  
  11.     }  
  12.   
  13. }  
[java] view plain copy
 
  1. public class ServerThree implements PlayerCount {  
  2.   
  3.     @Override  
  4.     public String getServerName() {  
  5.         return "三服";  
  6.     }  
  7.   
  8.     @Override  
  9.     public int getPlayerCount() {  
  10.         return Utility.getOnlinePlayerCount(3);  
  11.     }  
  12.   
  13. }  

而後定義一個XMLBuilder類,用於將各服的數據封裝成XML格式,代碼以下:設計

[java] view plain copy
 
  1. public class XMLBuilder {  
  2.   
  3.     public static String buildXML(PlayerCount player) {  
  4.         StringBuilder builder = new StringBuilder();  
  5.         builder.append("<root>");  
  6.         builder.append("<server>").append(player.getServerName()).append("</server>");  
  7.         builder.append("<player_count").append(player.getPlayerCount()).append("</player_count>");  
  8.         builder.append("</root>");  
  9.         return builder.toString();  
  10.     }  
  11.   
  12. }  

這樣的話,全部代碼就完工了,若是你想查看一服在線玩家數只須要調用:

[java] view plain copy
 
  1. XMLBuilder.buildXML(new ServerOne());  

查看二服在線玩家數只須要調用:

[java] view plain copy
 
  1. XMLBuilder.buildXML(new ServerTwo());  

查看三服在線玩家數只須要調用:

[java] view plain copy
 
  1. XMLBuilder.buildXML(new ServerThree());  

咦?你發現查看一服在線玩家數的時候,返回值永遠是-1,查看二服和三服都很正常。

 

你只好把你的leader叫了過來:「我感受我寫的代碼沒有問題,可是查詢一服在線玩家數老是返回-1,爲何會這樣呢?」

 

「哎呀!」你的leader猛然想起,「這是個人問題,前面沒跟你解釋清楚。因爲咱們的一服已經開放一段時間了,查詢在線玩家數量的功能早就有了,使用的是ServerFirst這個類。當時寫Utility.getOnlinePlayerCount()這個方法主要是爲了針對新開的二服和三服,就沒把一服的查詢功能再重複作一遍。」

 

聽到你的leader這麼說,你頓時鬆了一口氣:「那你修改一下Utility.getOnlinePlayerCount()就行了,應該沒我什麼事了吧?」

 

「晤。。。原本應該是這樣的。。。但是,Utility和ServerFirst這兩個類都已經被打到Jar包裏了,無法修改啊。。。」你的leader有些爲難。

 

「什麼?這不是坑爹嗎,難道要我把接口給改了?」你已經淚流滿面了。

 

「這倒不用,這種狀況下可使用適配器模式,這個模式就是爲了解決接口之間不兼容的問題而出現的。」

 

其實適配器模式的使用很是簡單,核心思想就是隻要能讓兩個互不兼容的接口能正常對接就好了。上面的代碼中,XMLBuilder中使用PlayerCount這個接口來拼裝XML,而ServerFirst並無實現PlayerCount這個接口,這個時候就須要一個適配器類來爲XMLBuilder和ServerFirst之間搭起一座橋樑,毫無疑問,ServerOne就將充當適配器類的角色。修改ServerOne的代碼,以下所示:

[java] view plain copy
 
  1. public class ServerOne implements PlayerCount {  
  2.       
  3.     private ServerFirst mServerFirst;  
  4.       
  5.     public ServerOne() {  
  6.         mServerFirst = new ServerFirst();  
  7.     }  
  8.   
  9.     @Override  
  10.     public String getServerName() {  
  11.         return "一服";  
  12.     }  
  13.   
  14.     @Override  
  15.     public int getPlayerCount() {  
  16.         return mServerFirst.getOnlinePlayerCount();  
  17.     }  
  18.   
  19. }  

這樣經過ServerOne的適配,XMLBuilder和ServerFirst之間就成功完成對接了!使用的時候咱們甚至無需知道有ServerFirst這個類,只須要正常建立ServerOne的實例就好了。

 

須要值得注意的一點是,適配器模式不併是那種會讓架構變得更合理的模式,更多的時候它只是充當救火隊員的角色,幫助解決因爲前期架構設計不合理致使的接口不匹配的問題。更好的作法是在設計的時候就儘可能把之後可能出現的狀況多考慮一些,在這個問題上不要向你的leader學習。

 

適配器:將一個類的接口轉換成客戶但願的另一個接口。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。

相關文章
相關標籤/搜索