关闭

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

标签: Java设计模式Design Pattern适配器Adapter
40147人阅读 评论(116) 收藏 举报
分类:

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9400141


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


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


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


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


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


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


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

public interface PlayerCount {

	String getServerName();

	int getPlayerCount();

}
接着定义三个统计类实现了PlayerCount接口,分别对应了三个不同的服,如下所示:
public class ServerOne implements PlayerCount {

	@Override
	public String getServerName() {
		return "一服";
	}

	@Override
	public int getPlayerCount() {
		return Utility.getOnlinePlayerCount(1);
	}

}
public class ServerTwo implements PlayerCount {

	@Override
	public String getServerName() {
		return "二服";
	}

	@Override
	public int getPlayerCount() {
		return Utility.getOnlinePlayerCount(2);
	}

}
public class ServerThree implements PlayerCount {

	@Override
	public String getServerName() {
		return "三服";
	}

	@Override
	public int getPlayerCount() {
		return Utility.getOnlinePlayerCount(3);
	}

}
然后定义一个XMLBuilder类,用于将各服的数据封装成XML格式,代码如下:
public class XMLBuilder {

	public static String buildXML(PlayerCount player) {
		StringBuilder builder = new StringBuilder();
		builder.append("<root>");
		builder.append("<server>").append(player.getServerName()).append("</server>");
		builder.append("<player_count").append(player.getPlayerCount()).append("</player_count>");
		builder.append("</root>");
		return builder.toString();
	}

}
这样的话,所有代码就完工了,如果你想查看一服在线玩家数只需要调用:
XMLBuilder.buildXML(new ServerOne());
查看二服在线玩家数只需要调用:
XMLBuilder.buildXML(new ServerTwo());
查看三服在线玩家数只需要调用:
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的代码,如下所示:

public class ServerOne implements PlayerCount {
	
	private ServerFirst mServerFirst;
	
	public ServerOne() {
		mServerFirst = new ServerFirst();
	}

	@Override
	public String getServerName() {
		return "一服";
	}

	@Override
	public int getPlayerCount() {
		return mServerFirst.getOnlinePlayerCount();
	}

}
这样通过ServerOne的适配,XMLBuilder和ServerFirst之间就成功完成对接了!使用的时候我们甚至无需知道有ServerFirst这个类,只需要正常创建ServerOne的实例就行了。


需要值得注意的一点是,适配器模式不并是那种会让架构变得更合理的模式,更多的时候它只是充当救火队员的角色,帮助解决由于前期架构设计不合理导致的接口不匹配的问题。更好的做法是在设计的时候就尽量把以后可能出现的情况多考虑一些,在这个问题上不要向你的leader学习。


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


关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

微信扫一扫下方二维码即可关注:

        

169
12
查看评论

Java设计模式(一) Adapter(适配器)模式及I/O实例引申

基本概念适配器模式是一种补救模式,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。是包装模式(对类或者对象进行包装)的一种,分为类适配器和对象适配器,是从实现层面上划分。这个模式中包含三种角色: Target目标角色:该角色定义我们要...
  • qq_24451605
  • qq_24451605
  • 2016-04-13 13:59
  • 1105

Java 实现适配器(Adapter)模式

平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法。有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的。这个时候Adapter模式就会派上用场了 适配器 模式 有三种方式,一种是对象适配器,一种...
  • jjwwmlp456
  • jjwwmlp456
  • 2014-10-08 15:21
  • 8137

Java中的适配器(adapter)

适配器(adapter)有的接口具有多个方法,比如WindowListener接口:public interface WindowListener { void windowOpened(WindowEvent e); void windowClosing(WindowEvent e...
  • lichengyu
  • lichengyu
  • 2015-12-05 14:52
  • 896

java Adapter模式

2009-08-19转载 : http://yahaitt.javaeye.com/blog/453032java Adapter模式关键字: android adapter 通常,客户类(clients of class)通过类的接口访问它提供的服务。有时,现有的类(existing class)...
  • ligaoyang
  • ligaoyang
  • 2009-09-28 23:07
  • 4967

Android适配器Adapter学习

在开发中我们需要绑定一些数据展现到桌面上,这是就需要AdapterView。AdapterView是ViewGroup的子类,它决定了怎么展现视图通过Adapter来绑定特殊的数据类型。 AdapterView是非常有帮助的当你展现数据在你的布局中。Gallery,ListView和 Spinne...
  • wangkuifeng0118
  • wangkuifeng0118
  • 2011-12-04 19:32
  • 6092

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

(一)概述 Adapter是作为连接数据跟View之间桥梁的,你可以创建一个View来使用Adapter来对数据直接进行填充; (二)Adapter(适配器)的使用 先来看看他的类结构图: 实际开发中经常用到的那几个Adapter: 用到,不过有点过时了,不推荐使用; 其...
  • MakeYourChance
  • MakeYourChance
  • 2016-06-24 21:52
  • 4238

Adapter适配器与具体应用

一.Adapter介绍: 1.Adapter是什么: 2.Adapter应用场合: 3.Adapter构成: 4.Adapter工作原理及理解: 5.适配器的种类: 二.ListView中的应用: 1.左侧元素的显示实现过程: 2.右侧导航栏的实现过程: 三.GridView种的应用: 项目实现过程...
  • zhangbenzhi
  • zhangbenzhi
  • 2016-06-05 19:28
  • 598

两种适配器模式(Adapter Pattern)

1. 概述   适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 2. 解决的问题   举个例子:有一个三相插座,可是此时使用的小台灯的插头是一个两相插头,插不进去呀。这个时候就会想到使用插线板,插线板的插头可以...
  • onlyyjco
  • onlyyjco
  • 2016-09-09 10:28
  • 1908

设计模式:适配器模式(Adapter)

适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。  适配器模式有类适配器模式和对象适配器模式两种不同的形式。 类适配器  类适配器模式把适配的类的API转换成目标类的API  适配器模式所涉及的角色: 目标角色(T...
  • u013256816
  • u013256816
  • 2016-03-28 18:56
  • 3161

java适配器模式(Adapter)-结构型

Java适配器模式及其在Java中的应用
  • sunxianghuang
  • sunxianghuang
  • 2016-07-03 21:26
  • 637
    个人资料
    • 访问:8061832次
    • 积分:42182
    • 等级:
    • 排名:第96名
    • 原创:103篇
    • 转载:0篇
    • 译文:6篇
    • 评论:14373条
    我的新书
    微信公众号推荐

    关注我的技术公众号,每天都有优质技术文章推送。

    关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫上方二维码即可关注

    共同进步
    感兴趣的朋友可以加入我的QQ群,一起讨论学习,共同进步。
    群号:153325493
    人数有限,请不要重复加群 (即满)
    博客专栏
    最新评论
    统计