设计模式之适配器模式

设计模式Java大约 2524 字

作用

使得原本由于接口不兼容而不能一起工作那些类可以一起工作。

适配器类型src形式关系
类适配器以类给到在Adapter里,将src当作类继承
对象适配器以对象给到在Adapter里,将src当作对象持有(聚合)
接口适配器以接口给到在Adapter里,将src当作接口实现

案例

类适配器

通过继承src类,实现dst接口,完成src->dst的适配

phone.charging(new VoltageAdapter());

public class Phone {

    public void charging(IVoltage5V iVoltage5V) {
        if (iVoltage5V.output5V() == 5) {
            System.out.println("可以充电");
        }
    }

}

/**
 * VoltageAdapter是适配器类
 */
public class VoltageAdapter extends Voltage220V implements IVoltage5V {

    @Override
    public int output5V() {
        int srcV = output220V();
        int dstV = srcV / 44;
        return dstV;
    }
}

/**
 * Voltage220V是被适配的类
 */
public class Voltage220V {

    public int output220V() {
        return 220;
    }

}

/**
 * IVoltage5V是适配接口
 */
public interface IVoltage5V {

    int output5V();

}

对象适配器

对象适配器和类适配器是同一种思想,使用组合关系代替了继承,解决了类适配器必须继承src的局限性,也不再要求dst必须是接口。

phone.charging(new VoltageAdapter(new Voltage220V()));

public class Phone {

    public void charging(IVoltage5V iVoltage5V) {
        if (iVoltage5V.output5V() == 5) {
            System.out.println("可以充电");
        }
    }

}

/**
 * 对象适配器
 */
public class VoltageAdapter implements IVoltage5V {

    private Voltage220V voltage220V;

    public VoltageAdapter(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        int srcV = voltage220V.output220V();
        int dstV = srcV / 44;
        return dstV;
    }
}

/**
 * Voltage220V是被适配的类
 */
public class Voltage220V {

    public int output220V() {
        return 220;
    }

}

/**
 * IVoltage5V是适配接口
 */
public interface IVoltage5V {

    int output5V();

}

接口适配器

将Interface1的方法进行默认实现,实现method1、method2、method3。

用到哪些方法就只需复写该方法即可。

AbstractAdapter abstractAdapter = new AbstractAdapter() {
    //只需要复写想用的方法即可
    @Override
    public void method1() {
        System.out.println("复写后的method1");
    }
};
abstractAdapter.method1();

/**
 * 接口适配器
 */
public abstract class AbstractAdapter implements Interface1 {

    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }

    @Override
    public void method3() {

    }

}

public interface Interface1 {

    void method1();
    void method2();
    void method3();

}

源码

Netty中的实现类ChannelInboundHandlerAdapter继承了抽象类ChannelHandlerAdapter实现了ChannelHandler接口。

io.netty.channel.ChannelHandler

io.netty.channel.ChannelHandlerAdapter

io.netty.channel.ChannelInboundHandlerAdapter

阅读 252 · 发布于 2019-12-17

————        END        ————

扫描下方二维码关注公众号和小程序↓↓↓

昵称:
随便看看换一批