关闭

适配器模式

755人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:194649次
    • 积分:2043
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:1篇
    • 译文:0篇
    • 评论:83条
    最新评论