适配器模式分为三种:类的适配器模式,对象的适配器模式,接口的适配器模式。
适配器模式是将某个类的接口转换成程序期望的另一种接口表示,目的是消除由于接口不匹配而造成的类的兼容性问题。
说起来有点绕口,看一下例子:
1.类的适配器模式:
package cn.lh.designer.classAdapter;
/**
* 类的适配器模式
* @author lihao
*
*/
public class ClassSource {
public void method1(){
System.out.println("需要适配的方法");
}
}
package cn.lh.designer.classAdapter;
public interface ClassTargetInterface {
void method1();
void method2();
}
package cn.lh.designer.classAdapter;
public class ClassAdapter extends ClassSource implements ClassTargetInterface{
@Override
public void method2() {
System.out.println("method2方法实现");
}
}
package cn.lh.designer.classAdapter;
public class TestClassAdapter {
public static void main(String[] args) {
ClassAdapter ca = new ClassAdapter();
ca.method1();
ca.method2();
}
}
注意:ClassAdapter类意味着我希望有ClassSoure类的功能而又需要实现target接口,不难看出,其实ClassSource就是一个适配器类,这是我的个人理解。
2.对象的适配器模式
其实对象的适配器模式跟类的适配器模式差不多,只不过由原来的继承ClassSoure类改为了创建该类对象。如下:
package cn.lh.designer.classAdapter;
public class ObjectAdapterWrapper implements ClassTargetInterface{
private ClassSource source;
public ObjectAdapterWrapper(ClassSource source) {
this.source = source;
}
@Override
public void method1() {
source.method1();
}
@Override
public void method2() {
System.out.println("method2方法");
}
}
package cn.lh.designer.classAdapter;
public class TestObjectAdapterWrapper {
public static void main(String[] args) {
ClassSource cs = new ClassSource();
ObjectAdapterWrapper oaw = new ObjectAdapterWrapper(cs);
oaw.method1();
oaw.method2();
}
}
3.接口的适配器模式
关于接口的适配器模式其实是我们开发中遇到最多的一种情况了,是这样的,当开发过程中,一个接口可能会有许多抽象方法,但是我们有一些实现类并不需要实现所有的方法,而是只需要实现一部分方法。这时候就需要接口的适配器模式,我们需要一个抽象类实现了该接口,并实现了该接口中的所有方法,我们不和原始接口打交道,而是只和该抽象类打交道,只需要重写我们需要的方法即可。但是弊端就是java当中类只有单继承。看下例子:
package cn.lh.designer.interaceAdapter;
/**
* 我们只需要实现method1和method2两个方法
* @author lihao
*
*/
public interface SouceAble {
void method1();
void method2();
void method3();
void method4();
void method5();
void method6();
}
package cn.lh.designer.interaceAdapter;
public abstract class SourceAbleAdapter implements SouceAble{
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method3() {
// TODO Auto-generated method stub
}
@Override
public void method4() {
// TODO Auto-generated method stub
}
@Override
public void method5() {
// TODO Auto-generated method stub
}
@Override
public void method6() {
// TODO Auto-generated method stub
}
}
package cn.lh.designer.interaceAdapter;
public class SourceByAdapter extends SourceAbleAdapter{
@Override
public void method1() {
System.out.println("method1调用");
}
@Override
public void method2() {
System.out.println("method2调用");
}
}
package cn.lh.designer.interaceAdapter;
public class TestSourceByAdapter {
public static void main(String[] args) {
SourceByAdapter sba = new SourceByAdapter();
sba.method1();
sba.method2();
}
}