适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器使得原本不兼容的两个接口可以一起工作,主要分为类的适配器、对象的适配器、接口的适配器
类的适配器
public class Source { public void method1(){ System.out.println("我是原本的类的方法"); } } public interface Target { void method1(); void method2(); } public class Adapter extends Source implements Target { @Override public void method2() { System.out.println("我是接口的实现类的方法"); } }
这里有一个Source类,里面有个method1方法,还有一个Target接口(method1是适配的方法,不用实现)
我们用一个Adpater类继承Source类和实现Target接口,然后覆盖method2方法,因为接口的method1方法和Adpater类的父类Source的method1相同,所以Adpater调用的method1是父类的方法,并且被当做接口Target的实现,不用实现target的方法(当然,如果覆盖了method1方法会被当成接口的实现,而不是子类的覆盖,接口优先级高于父类)
这里测试一下
public class Test { public static void main(String[] args) { Target target =new Adapter(); target.method1(); target.method2(); } }
这里也是接口的引用指向实现类,这样Target接口的实现类就具有Source类的功能了
二:对象的适配器
跟类的适配器差不多,实现类Adpater持有Source类的实例就好了
public class Adapter implements Target { private Source source; public Adapter(Source source) { this.source = source; } @Override public void method1() { source.method1(); } @Override public void method2() { System.out.println("我是接口的实现类的方法"); } }
这时候就不能直接用父类Source的方法method1当做接口Target的实现了,需要在构造器里面引用Source,在实现类的方法中用Source的method1
三:接口的适配器
在实际开发中,某个接口中有多个抽象方法,当实现这个接口时,需要实现它所有的接口,这明显有些浪费,有些可能是不需要用到的,为了解决这个问题。
我们引用了一个抽象类,该抽象类实现了该接口,实现该接口的所有方法,然后别的类直接继承这个抽象类。
public abstract class AbstractTarget implements Target { @Override public void method1() { System.out.println("我是抽象类实现的方法1"); } @Override public void method2() { System.out.println("我是抽象类实现的方法2"); } } public class Adpater1 extends AbstractTarget { @Override public void method1() { System.out.println("我是Adpater子类覆盖的方法1"); } } public class Adpater2 extends AbstractTarget{ @Override public void method2() { System.out.println("我是Adpater2子类覆盖的方法2"); } }
这样一来,抽象类的子类就可以挑它喜欢的方法实现就行了,记住抽象类如果没有把接口的方法实现过,其子类会被要求实现