第24章
大b:“我还是跟你讲讲类适配器和对象适配器吧!举些例子,这样你就明白了。”
小a:“好!”
大b:“要正确地区别这两种适配器的区别,我们还是从一个简单的例子开始吧!我们的系统中有一个具有某个特定功能的类adaptee,一个客户类client——他需要一个实现target接口的对象,和一个target接口。”以下是它们的源码:
//adaptee.java
publicclassadaptee{
publicvoidspecialrequest(){
system.out.println(“calledspecificrequest()inadaptee”);
}
}
//client.java
publicclassclient{
publicstaticvoidmain(string[]args){
targett=……//newadapter();
t.request();
}
}
//target.java
publicinterfacetarget{
publicvoidrequest();
}
“根据上面的分析我们知道此时需要一个adapter对象,该对象实现target接口,同时它又重用现有的adaptee类。任何有一点点oo(面向对象)知识的人都会想到通过继承可以达到重用的目的。”
下面是通过继承实现adaptee类重用的例子:
//adapter.java
publicclassadapterextendsadapteeimplementstarget{
publicvoidrequest(){
this.specialrequest();
}
}
大b:“看,简单明了吧!现在的过程就是:客户调用target接口的request方法,实际就是调用其父类adaptee的specialrequest方法。”
小a:“嘿嘿!这样一说倒真的是简单喔!”
大b:“对啊!这就是大家通常常说的类的适配器!类适配器具有以下的两个特点:1、适配器类(adapter)实现target接口;2、适配器类(adapter)通过继承来实现对adaptee类的重用。”
下面是一个通过组合关系实现继承的例子,以下是源码:
//adapter.java
publicclassadapterimplementstarget{
adapteeadaptee=newadaptee();
publicvoidrequest(){
adaptee.specialrequest();
}
}
对于这两者不同的适配器客户代码其实是完全一样的。以下是客户的代码:
//client.java
publicclassclient{
publicstaticvoidmain(string[]args){
targett=newadapter();
t.request();
}
}
大b:“现在可是全明白了吧?”
小a:“嘿嘿!现在都懂了。”