适配器模式

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


适配器模式

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

     适配器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)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值