1.概述
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
模式中的角色
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
需要适配的类(Adaptee):需要适配的类或适配者类。
适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
适配器模式有2种,第一种是“面向类的适配器模式”,第二种是“面向对象的适配器模式”。
2.类的适配器
先说“面向类的适配器模式”。顾名思义,这类适配器模式就是主要用于,单一的为某个类而实现适配的这样一种模式,为什么说只为某个类去实现,一会提到,我们先展示这种类适配模式的代码实现。
package com.visionsky.DesignPattern; //目标接口的代码如下: interface Target { void Request(); } //源的代码如下: class Adaptee { void SpecificRequst() { System.out.println("Adaptee's SpecificRequst"); } } //适配器的代码如下: class Adapter extends Adaptee implements Target { @Override public void Request() { System.out.println("Adapter's Request"); super.SpecificRequst(); } } public class AdapterDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Target t=new Adapter(); t.Request(); } }
好了,代码看完然后要做一些说明了,之前遗留的一个问题,为什么称其为类适配模式呢?很显然的,Adapter类继承了Adaptee类,而在Java这种单继承的语言中也就意味着,他不可能再去继承其他的类了,这样也就是这个适配器只为Adaptee这一个类服务,所以称其为类适配模式。
3.对象的适配器
说完类的适配模式,我们要开始说第2种对象的适配器模式了。对象适配器模式是把“源”作为一个对象聚合到适配器类中。同样的话不多说,贴上代码:
//源的代码以及目标代码同上,再次不再赘述。 //仅贴出适配器代码: class Adapter implements Target { private Adaptee adaptee; public Adapter() { this.adaptee=new Adaptee(); } @Override public void Request() { System.out.println("Adapter's Request"); adaptee.SpecificRequst(); } } public class AdapterDemo { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Target t=new Adapter(); t.Request(); } }
对象的适配器模式,把“源”作为一个构造参数传入适配器,然后执行接口所要求的方法。这种适配模式可以为多个源进行适配,弥补了类适配模式的不足。
4.比较
1.类的适配模式用于单一源的适配,由于它的源的单一话,代码实现不用写选择逻辑,很清晰;而对象的适配模式则可用于多源的适配,弥补了类适配模式的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,弱点是,由于源的数目可以较多,所以具体的实现条件选择分支比较多,不太清晰。
2.适配器模式主要用于几种情况:(1)系统需要使用现有的类,但现有的类不完全符合需要。(2)讲彼此没有太大关联的类引进来一起完成某项工作(指对象适配)。
本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1658944