这两天,听到有人讨论适配器模式,讨论的是对象适配器和类适配器。他们对着Adaptee和Adapter大声讨论着,本来想发表自己的想法,结果被他们大声盖住,只能回家写出自己的想法,并且从他们的讨论中更加深入的理解了适配器是什么。
client和Adaptee之前是什么关系?多对多。一个写好的client处理程序,在后续可能会有需要新的处理对象,而这些处理对象不符合client的接口需要,那么就需要对些Adaptee进行适配,适配成满足client需要的Adapter。这是一个client对多个Adaptee的情况。也有多个client对一Adaptee的情况,因为多个client都可能需要去执行Adaptee,不同的client需要不同的接口对象,那么这个Adaptee就会被适配成不同的接口,这是多个client对一个Adaptee的情况。
首先,适配器是为client服务的,是先有client,再有Adapter,或者说,是先从client的角度看待,发现Adaptee不能满足接口的统一性,需要Adapter。而Adaptee可能在任何Adapter之前的任何时候出现都可以。client是我们的代码,而且是已经存在的代码,里面的实现方式是:
class client{
Adapter adapter;
void method(){
adapter.methodAdapter();
}
}
请注意,这个client里面持有的Adapter是指一个接口或者抽象,并不是说就是适配器。因为我们有client的时候,还不需要适配器。
在client接口一定的情况下,希望client也能去执行adaptee的methodAdaptee方法,但是client只认识adapter的methodAdapter方法,怎么办呢?这个时候,适配器隆重出场了。
class 适配器 implements Adapter{
Adaptee adaptee;
void methodAdapter(){
adaptee.methodAdaptee();
}
}
通过这个转换,我们就可以把Adaptee包裹成Adapter,然后送给client。client发现这是个Adapter,具有methodAdapter方法,从而去执行。但是由于内部实际包装了Adaptee的方法,从而达成了执行Adaptee的方法的目标。