关闭

适配器模式

821人阅读 评论(0) 收藏 举报
分类:

个人学习总结,留着备用,如果有不对的地方请各位指教,谢谢!


适配器模式

     适配器模式把一个类的接口变成客户端所需要的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作。 

     适配器Adapter的作用就是将“源”与“目标”进行匹配。举一个形象的例子,比如我最近想换工作,那么我自己本身就是一个“源”Adaptee,自身拥有的技能就是JAVA和Android,而恰巧钟意的工作相当于“目标”Target,岗位要求处了这两项技能外,还需要了解Hadoop。此时,如果去面试就显得尴尬了。好了,问题来了,如何让我拥有Hadoop技能顺利通过面试呢,也就是说如果实现从“源”到“目标”的匹配。那么问题的关键就明显了,如何添加一个熟悉Hadoop的方法,也许你会讲,直接在“源”中添加Hadoop不就解决完事了么? 当然,如果“源”具备此功能的话,也就不需要什么适配器模式了,对吧!

      我的理解,适配器是为了实现某种目的为一个“源”类暂时性添加某种方法,不应破坏源类的结构,如果日后出现新的需求,则又改“源类”这样不符合JAVA高内聚,低耦合的原理。

适配器结构

      适配器有类适配器模式和对象适配器两个不同表达形式。

类适配器模式

      模块所涉及的角色:

      1、目标角色Target:所期待的接口,就像上面例子中钟意的工作;

      2、源角色Adaptee:需要适配的接口,就像上面例子中的我;

      3、适配器Adapter角色:将“源”匹配到“目标”的具体类;

源代码:

package com.niuxl;
/**
 * 源角色
 * @author KATA-pc
 *
 */
public class Adaptee {
	
	public void Java(){
		//具体实现
	} ;
	public void Android(){
		//具体实现
	} ;
}

源类是个具体类,实现了两个方法;

package com.niuxl;
/**
 * 目标接口
 * @author KATA-pc
 *
 */
public interface Target {
	public void Java() ;
	public void Android() ;
	public void Hadoop() ;
}

目标角色定义为接口,声明了三个方法;

package com.niuxl;
/**
 * 适配器角色
 * @author KATA-pc
 *
 */
public class Adapter extends Adaptee implements Target {

	@Override
	public void Hadoop() {
		// TODO Auto-generated method stub
		// 具体实现
	}
}

 

    简而言之:类适配器模式为单一类实现适配才采用的模式。想必看完代码,就清晰很多了,为什么叫做其为类适配器模式?Adapter类继承了Adaptee类,在JAVA语言中继承存在单一性,其不能再去继承其他类,这样的适配器只能为Adaptee类服务,同时实现Target接口,覆写其另一个方法即可满足目标接口要求。


对象适配器模式:

    与类适配器模式一样,同样是将“源”到“目标”进行匹配,区别在与不在使用继承管理,采用委派关系将Apdatee类组合到Adapter类中。

源代码:

因目标接口和源类不变,采用上面即可,只贴出对象适配器对应代码:

package com.niuxl;

/**
 * 对象适配器
 * @author KATA-pc
 *
 */
public class AdapterObj {
	
	Adaptee adaptee ;
	
	public AdapterObj(Adaptee adaptee){
		this.adaptee = adaptee ;
	}
	public void Java(){
		this.adaptee.Java(); 
	}
	public void Android(){}{
		this.adaptee.Android(); 
	}
	// 新增方法匹配目标接口
	public void Hadoop(){
		//具体操作
	}
}

 对象的适配器模式,把“源”作为一个构造参数传入适配器,然后执行接口所要求的方法。这种适配模式可以为多个源进行适配。弥补了类适配模式的不足。


两个方式区别: 

    1、类适配器采用对象继承方式,是静态的定义方式;而对象适配器使用对象组合方式,是动态组合方式;


    2、对于类适配器,类适配器可以去重定义Adaptee的部分方法,因子类可以覆盖父类部分相关实现方法;而对象适配器要重定义Adaptee行为比较困难,需要定义Adaptee的子类来实现方法覆写。


    3、类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。


适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

 

 

 

0
0
查看评论

JAVA适配器模式示例

将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1、目标:目标是一个接口,该接口是客户想使用的接口 2、被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3、适配器:适配器是一...
  • qq7342272
  • qq7342272
  • 2011-10-31 14:02
  • 6193

运用适配器模式应对项目中的变化

从上面可知随着项目的进行, 导致了接口的改变。但是我的前端工程中已经大量使用了ESPMenu对象, 大量调用了ESPMenu的方法,并且对ESPMenu的访问分散在不同的文件中。如果要把ESPMenu替换成StubObject, 那就得该多个文件, 容易引起不一致和混乱。这不是一个好的对策。 那么...
  • brave2211
  • brave2211
  • 2014-01-26 13:25
  • 6135

设计模式-适配器模式(Go语言描述)

在上一篇博客设计模式-策略模式(Go语言描述)中我们用最简单的代码用go语言描述了 设计模式中的策略模式,用最简单的实例来描述相信可以让初学者可以很轻松的掌握各种设计模式。继上篇博客,我们接着用同样简单的代码来了解一下适配器模式。适配器模式介绍说起适配器模式,相信很多做android的同学第一印象...
  • qibin0506
  • qibin0506
  • 2016-01-28 08:56
  • 6354

设计模式——适配器模式 Java源代码

适配器模式,《Head First Design Patterns》给的代码的例子是关于鸭子和火鸡,然而鸭子和火鸡离日常生活比较远。这次,我改编了实验楼网站上面的例子,关于插座和充电器。
  • u013390476
  • u013390476
  • 2016-01-01 16:02
  • 2556

五分钟一个设计模式之适配器模式

五分钟一个设计模式,用最简单的方法来描述设计模式。查看更多设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/category/3259443认识适配器模式适配器模式的定义是:将一个类的接口转换成客户端希望的另外一个接口。适配器...
  • daguanjia11
  • daguanjia11
  • 2015-06-09 07:14
  • 1560

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

现实生活中的适配器 本文讨论适配器模式。适配器模式是23中设计模式之一,它的主要作用是在新接口和老接口之间进行适配。它非常像我们出国旅行时带的电源转换器。为了举这个例子,我还特意去京东上搜了一下电源转换器,确实看到了很多地方的标准不一样。我们国家的电器使用普通的扁平两项或三项插头,而去外国...
  • henren555
  • henren555
  • 2014-09-15 11:10
  • 3504

一个简单的适配器模式例子

Java的老一辈开发者应该比较熟悉Vector,Stack,Hashtable等集合类。它们的elements()返回一个实现了Enumeration接口的实现类。 但是自从出现Iterator以后,就很少再使用Enumeration了。 Iterator接口声明了三个方法: hasNext()...
  • czjuttsw
  • czjuttsw
  • 2013-02-15 13:12
  • 2182

SpringMvc中使用到的适配器模式

此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:  Java代码   if(mappedHandler.getHan...
  • bu123dian
  • bu123dian
  • 2016-10-10 16:21
  • 2258

Design Pattern: 策略模式和适配器模式

策略模式用于抽象对于同一个对象的不同处理方式,把相同处理方式(内部状态)抽象成一个类,通过策略选择类选择产生对应的策略来处理输入的对象。 换个角度想想,其实策略模式需要结合简单工厂模式一起使用,是一种进化版的简单工厂类。可以说策略模式是实现简单工厂模式的一种必要。就像直接把计算器的不同算法加减乘...
  • Firehotest
  • Firehotest
  • 2016-10-02 10:12
  • 1096

设计模式php实例:适配器模式

适配器模式将一个类的换成客户端需要的另一个接口,使原本不兼容的接口能一起工作。一个现实中的例子,假如屋里墙上只有两项插口,而风扇有三个插头,这时需要再拿一个移动插线板,插线板接入墙壁插口的一段是两项插头,插线板另外一段能够提供三项插口给风扇,这时候插线板起到了一个适配器的作用。 在应用中,适配器模...
  • wzllai
  • wzllai
  • 2012-08-05 19:54
  • 3108
    个人资料
    • 访问:207530次
    • 积分:2157
    • 等级:
    • 排名:千里之外
    • 原创:57篇
    • 转载:1篇
    • 译文:0篇
    • 评论:86条
    最新评论