适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器使得原本不兼容的两个接口可以一起工作,主要分为类的适配器、对象的适配器、接口的适配器

 

类的适配器

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");
    }
}

  

这样一来,抽象类的子类就可以挑它喜欢的方法实现就行了,记住抽象类如果没有把接口的方法实现过,其子类会被要求实现

posted on 2019-03-09 16:45  蓝绿绿  阅读(100)  评论(0编辑  收藏  举报