Design Pattern | Adapter Pattern aka Wrapper
by Botao Xiao
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
类的适配器模式
我们已经有的类是Source类,而需要的则是一个Targetable类,我们通过适配器将Source转化成Target类。 当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的接口A方法中直接引用BB中的合适方法,这样就完成了一个简单的类适配器。
- 我们已经有了一个方法的实现类,其中含有method1方法,但是这个方法不满足需求(需要method2用到方法)
public class Source { public void method1(){ System.out.println("Realize the method1..."); } }
- Targetable使我们目标的类,我们希望实现这个类的功能,但是我们又不想重新实现这个接口的所有方法。
```Java
public interface Targetable {
/**
- @Description method1 is already implemented in Source
- @Return: void */ public void method1(); /**
- @Description Another method which is really necessary
- @Return: void */ public void method2(); } ```
- 继承了Source方法,实现了Target类。
public class Adapter extends Source implements Targetable { @Override public void method2() { System.out.println("This is method2..."); } }
- 实际上Adapter实现了Targetable,通过继承实现了方法的复用。自己实现了未实现的方法。
public class TargetTest1 { public static void main(String[] args) { Targetable target = new Adapter(); target.method1(); target.method2(); } }
对象的适配器模式
public class Wrapper implements Targetable {
private Source source; //内涵了一个source对象。
public Wrapper(Source source){
this.source = source;
}
@Override
public void method1() { //通过source对象复用已经实现的方法。
source.method1();
}
@Override
public void method2() { //自己实现method2方法。
System.out.println("This is method2...");
}
}
接口的适配器模式
有事后接口中定义了过多的方法,然而调用有时候我们并不需要如此多的方法,但是我们我们却要实现所有的方法才能生成出对象的实例,所以我们实现一个抽象类,实现了部分通用的方法,在我们生成接口的实例时,我们不必实现所有的方法,只需要继承抽象类。重写我们需要修改的接口。
- 定义了一个接口,内部定义了多个方法。
public interface Sourcable { public void method1(); public void method2(); }
- 实现一个抽象类,内部实现一些通用的方法,一些独立性较强的类留着不实现。
public abstract class SourceWrapper implements Sourcable { @Override public void method1() { } @Override public void method2() { } }
- 实现专属的类重写并且实现某些方法,这样就避免了实现所有的方法。
public class SourceSub1 extends SourceWrapper { @Override public void method1() { System.out.println("This is a implementation of method1..."); } } public class SourceSub2 extends SourceWrapper{ @Override public void method2() { System.out.println("This is a implementation of method2..."); } }
总结
类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。
Subscribe via RSS