适配器模式【结构型模式】

一、引出适配器模式概念

我们要给手机充电,但是我们知道家用电是220v,而我们的手机一般是5v,如果我们直接使用那显然是不行的。这时候我们就需要一个转换器,也就是我们的充电器。它在内部把220v转换成5v。

我们的适配器也是同理,当我们需要使用某个类但是不能直接使用,这个时候就需要适配器来进行一下转换。


二、适配器

一个适配器包含了三种角色:

  • 资源对象(src)
  • 适配器(adapter)
  • 目标接口(dist)

2-1:类适配器

2-1-1:src 资源对象

// 220v 电压提供者
public class Src220V {
    
    public int outPut220V(){
        int src = 220;
        return src;
    }
}

2-1-2:dist接口

// 提供一个5v的接口
public interface Dist5V {
    
    int outPut5v();
}

2-1-3:adapter 适配器

public class adapter extends Src220V implements Dist5V {

    @Override
    public int outPut5v() {
        int i = outPut220V();
        // ---- 具体的转换业务
        
        // ---
        return i / 44;
    }
}

2-1-4:测试

public class Main {

    public static void main(String[] args) {
        new adapter().outPut5v();
    }
}

类适配器: 适配器继承资源对象,然后实现目录接口重写里面的方法。

总结

  • 优点:直接继承了src类,可以重写里面的方法,试得Adapter更加的灵活。
  • 缺点:因为Java里面是单继承的,这次继承之后,我们后面就无法再继承了,并且继承src那么dist就必须是接口。



2-2:对象适配器

类适配器,使用继承存在问题。对象适配器使用组合的方式解决单继承的问题。

2-2-1:src 资源对象 (不需要改变)

// 220v 电压提供者
public class Src220V {
    
    public int outPut220V(){
        int src = 220;
        return src;
    }
}

2-2-2:dist接口 (不需要改变)

// 提供一个5v的接口
public interface Dist5V {

    int outPut5v();
}

2-2-3:adapter 适配器

public class adapter implements Dist5V {

    private Src220V src220V;

    public adapter(Src220V src220V){
        this.src220V = src220V;
    }

    @Override
    public int outPut5v() {
        int i = 0;
        if (src220V != null){
            i = src220V.outPut220V();
            // ---- 具体的转换业务

            // ---
            i = i / 44;
        }
        return i;
    }
}

2-2-4:测试

public class Main {

    public static void main(String[] args) {
        new adapter(new Src220V()).outPut5v();
    }
}

总结

  • 优点:根据合成复用原则,使用组合代替了继承。解决了继承问题和dist必须是接口的问题。
  • 缺点:我们实现了 dist 接口,就必须实现里面全部的方法,有些方法我们不需要也必须实现。

2-3:接口适配器

在JDK8之前,我们的解决办法是让一个抽象类实现接口里面的方法(空实现),然后我们继承抽象类就可以选择性的覆盖里面的方法了。

在JDK8之后,我们的接口支持默认实现了,这样的话,我们就不需要一个中间抽象类了。

2-3-1:我们修改 dist 接口

public interface Dist5V {

    default int outPut5v(){
        return 5;
    }

    default int outPut8v(){
        return 8;
    }

    default int outPut10v(){
        return 10;
    }
}

猜你喜欢

转载自blog.csdn.net/Tomwildboar/article/details/105843825