今天停了一天的电,白天根本写不了东西,唉~~
晚上来电了,开始写东西。
上次写了建造模式,现在再来看看适配器模式。
先说变压器(Adapter),变压器把一种电压变换成另一种电压。再看个成语,“移花接木”。 我们经常碰到要将一个类的接口转换成客户希望的另外一个接口,即让一个类里的某方法体现出另一个类里某方法产生的效果,或者是增加一个类的方法到另外一个类里。第一解决方案是:修改或增加类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改接口。 怎么办?
这个时候就要用到适配器了。
先看看下面的图:
对象的适配器(Adapter)模式
类的适配器(Adapter)模式
总的说来,就是客户访问Target的request( )方法,希望得到Adaptee中的specialRequest( )方法。
Adapter继承Target,因此客户可以访问Adapter了,在Adapter中,怎么得到specialRequest( )方法呢?
Adapter要得到Adaptee中的( )pecialRequest方法,可以有2种方式:
1.Adapter中没有specialRequest方法,它只是个中转站,它转而访问Adaptee得到specialRequest。
2.Adapter中存在specialRequest方法。
方法1中的,就是组合方式,而方法2则是继承方式。
第一种方法,是对象的适配器,第二种是类的适配器。
先说对象的适配器,看看下面的代码:
public class Adapter extends Target
{
private Adaptee adaptee;
public Adapter(Adaptee adaptee)
{
super( );
this.adaptee=adaptee;
}
public void request( )
{
adptee.specialRequest( );
}
}
Adapter 继承了Target,并重载了Target的request方法,使得结果得到specialRequest方法,满足了要求。
这个时候,Adapter叫做对象适配器,我们可以这么想,Adapter起的不是介绍对象的作用么?
一个对象适配器可以把多种不同的Adaptee适配到同一个目标(同一个适配器可以把源类和它的子类都适配到目标接口)。
对象适配器允许Target和Adaptee完全无关,只有Adapter知道二者的存在。
下面来说说类适配器。
对象适配器只继承了Target,但是,同样Adapter也可以继承Adaptee。由于java不允许多继承,所以要用到接口。
现在,我们把Adaptee变成继承一个接口,Adapter也继承同个接口,这样在Adapter中就存在specialRequest方法了,客户就可以直接访问Adapter.specialRequest( )了,
public interface IAdaptee {
public void specialRequest( );
……
}
public class Adaptee implements IAdaptee {
public void Adaptee ( ) {
//......
}
public void specialRequest( ){
//......
}
}
public class Adapter extends Target implements IAdaptee {
private Adaptee adptee;
public Adapter(Adaptee adptee) {
this.adptee=adptee;
}
public void specialRequest( ) {
adptee.specialRequest( );
}
}
在这种情况下,如果Target和Adaptee有一个相同名字的方法,Adapter不能保证这两个方法具有相同的含义或者行为,它不知道到底该用哪个方法,这是非常危险的,要注意。
我认为,适配器的功能只需要做到转换作用,我看到网上有什么在适配器里置换源类的方法什么的,有必要放适配器里吗?还看得人一楞一楞的,真是伤脑筋。