Java设计模式透析之 —— 适配器(Adapter)

转载 2016年02月19日 13:22:51

今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数。”

你看了看日期,不是吧!这哪里是马上要开始了,分明是已经开始了!这怎么可能来得及呢?

“没关系的。”你的leader安慰你道:“功能其实很简单的,接口都已经提供好了,你只需要调用一下就行了。”

好吧,你勉为其难地接受了,对于这种突如其来的新需求,你早已习惯。

你的leader向你具体描述了一下需求,你们的游戏目前有三个服,一服已经开放一段时间了,二服和三服都是新开的服。设计的接口非常轻便,你只需要调用Utility.getOnlinePlayerCount(int),传入每个服对应的数值就可以获取到相应服在线玩家的数量了,如一服传入1,二服传入2,三服则传入3。如果你传入了一个不存在的服,则会返回-1。然后你只要将得到的数据拼装成XML就好,具体的显示功能由你的leader来完成。

好吧,听起来功能并不是很复杂,如果现在就开始动工好像还来得及,于是你马上敲起了代码。

首先定义一个用于统计在线人数的接口PlayerCount,代码如下:

[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学习。

适配器:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Java 实现适配器(Adapter)模式

平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法。有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的。...
  • jjwwmlp456
  • jjwwmlp456
  • 2014年10月08日 15:21
  • 7924

Java设计模式透析之 —— 适配器(Adapter)

今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧急任务!最近ChinaJoy马上就要开始了,老板要求提供一种直观的方式,可以查看到我们新上线的游戏中每个服的在线人数。” 你看了看日期,...
  • sinyu890807
  • sinyu890807
  • 2013年07月25日 09:01
  • 39857

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口。Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter。由于Class Adapter的实...
  • tracker_w
  • tracker_w
  • 2014年06月17日 03:39
  • 2403

Java设计模式之适配器模式(Adapter)在Android中的应用

1.概念:将内容与控件相分离的一种设计(公式) ,达到内容灵活显示的目的。2.适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。单独讲解接口的适配器模式a. 接口的适配器模式...
  • huang_xiao_yu
  • huang_xiao_yu
  • 2015年11月01日 00:33
  • 1100

Adapter适配器与具体应用

一.Adapter介绍: 1.Adapter是什么: 2.Adapter应用场合: 3.Adapter构成: 4.Adapter工作原理及理解: 5.适配器的种类: 二.ListView中的应用: 1...
  • zhangbenzhi
  • zhangbenzhi
  • 2016年06月05日 19:28
  • 563

Adapter类型控件之Adapter(数据适配器)

(一)概述 Adapter是作为连接数据跟View之间桥梁的,你可以创建一个View来使用Adapter来对数据直接进行填充; (二)Adapter(适配器)的使用 先来看看他的类结构图...
  • MakeYourChance
  • MakeYourChance
  • 2016年06月24日 21:52
  • 4166

一个示例让你明白适配器模式

本文讨论适配器模式。适配器模式是23中设计模式之一,它的主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。为了举这个例子,我还特意去京东上搜了一下电源转换器,确实看到了很多...
  • brave2211
  • brave2211
  • 2014年01月26日 00:08
  • 42465

ListView,GridView和适配器Adapter不得不说的秘密

ListView,GridView和适配器Adapter不得不说的秘密,欢迎进来看。。。
  • j06100610
  • j06100610
  • 2015年08月14日 23:36
  • 2481

浅析android适配器adapter中的那些坑

做项目中遇到的,折磨了我将近两天,今天把经验分享出来,让大家以后少走点弯路,好了,简单来说一下什么是android的适配器,如何定义,如何增加适配器的重用性,如何去降低程序的耦合性 适配器顾名思义是...
  • qq_23195583
  • qq_23195583
  • 2015年07月10日 12:55
  • 2220

Java设计模式透析之 —— 适配器(Adapter)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400141 今天一大早,你的leader就匆匆忙忙跑过来找到你:“快,快,紧...
  • qq_31753145
  • qq_31753145
  • 2016年04月23日 16:01
  • 224
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java设计模式透析之 —— 适配器(Adapter)
举报原因:
原因补充:

(最多只允许输入30个字)