适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器使得原本不兼容的两个接口可以一起工作,主要分为类的适配器、对象的适配器、接口的适配器
类的适配器
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");
}
}
这样一来,抽象类的子类就可以挑它喜欢的方法实现就行了,记住抽象类如果没有把接口的方法实现过,其子类会被要求实现
浙公网安备 33010602011771号