设计模式-适配器模式

99 阅读3分钟

概念:适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表 示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同 工作。其别名为包装器(Wrapper) 适配器模式属于结构型模式。

主要分为三类:类适配器模式、对象适配器模式、接口适配器模式

一.类适配器模式

1.类图:

image.png

2.代码:

//适配接口
public interface Voltage5V {
    public int output5V();
}

//被适配的类
public class Voltage220V {
    //输出220V电压
    public int output220v(){
        int src=220;
        System.out.println("电压="+src+"伏");
        return src;
    }
}

//适配器类
public class VoltageAdapter extends Voltage220V implements Voltage5V{
    @Override
    public int output5V() {
        //获取220v电压
        int srcV = output220v();
        int dstV=  srcV/44;
        return dstV;
    }
}

public class Phone {
    //充电
    public void charge(Voltage5V voltage5V){
        if(voltage5V.output5V()==5){
            System.out.println("电压5v开始充电~");
        }else {
            System.out.println("电压不符合充电标准");
        }

    }
}
public static void main(String[] args) {
    System.out.println("-------类适配器模式---------");
    //继承得到
    Phone phone = new Phone();
    phone.charge(new VoltageAdapter());
}

类适配器模式注意事项和细节

  1. Java是单继承机制,所以类适配器需要继承src类这一点算是一个缺点, 因为这要 求dst必须是接口,有一定局限性;

  2. src类的方法在Adapter中都会暴露出来,也增加了使用的成本。

  3. 由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵 活性增强了

二.对象适配器模式

根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。对象适配器模式是适配器模式常用的一种。

1.类图:

image.png

2.代码:

//适配接口
public interface Voltage5V {
    public int output5V();
}

//被适配的类
public class Voltage220V {
    //输出220V电压
    public int output220v(){
        int src=220;
        System.out.println("电压="+src+"伏");
        return src;
    }
}


//适配器类
public class VoltageAdapter  implements Voltage5V {
    //尽量使用聚合而不是继承
    private Voltage220V voltage220V;

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

    public void setVoltage220V(Voltage220V voltage220V) {
        this.voltage220V = voltage220V;
    }

    @Override
    public int output5V() {
        //获取220v电压
        int srcV = voltage220V.output220v();
        int dstV=  srcV/44;
        return dstV;
    }
}

public class Phone {
    //充电
    public void charge(Voltage5V voltage5V){
        if(voltage5V.output5V()==5){
            System.out.println("电压5v开始充电~");
        }else {
            System.out.println("电压不符合充电标准");
        }

    }
}

public static void main(String[] args) {
    System.out.println("-------对象适配器模式---------");
    Phone phone = new Phone();
    Voltage220V voltage220V = new Voltage220V();
    phone.charge(new VoltageAdapter(voltage220V));
}

三.接口适配器模式

当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接 口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆 盖父类的某些方法来实现需求。 适用于一个接口不想使用其所有的方法的情况。

1.类图:

image.png

2.代码:

public interface Interface4 {
    public void m1();
    public void m2();
    public void m3();
    public void m4();
}

//将Interface4接口中方法进行空实现
public abstract class AbsAdapter implements Interface4{
    @Override
    public void m1() {

    }

    @Override
    public void m2() {

    }

    @Override
    public void m3() {

    }

    @Override
    public void m4() {

    }
}
public static void main(String[] args) {
    AbsAdapter absAdapter = new AbsAdapter() {

        //需要那个方式 进行重写即可
        @Override
        public void m1() {
            System.out.println("使用了m1方法");
        }
    };

    absAdapter.m1();
    absAdapter.m2();//没有处理
}

应用

  • 适配器模式在SpringMVC框架应用的源码分析

todo 学习