【设计模式笔记】(十八)- 适配器模式

适配器模式(Adapter Pattern),此模式的作用就是兼容原本接口不匹配的两个类,起到桥梁的作用。

其实在Android中平常接触的就很多,ListViewGridViewRecyclerView都用到的Adapter就用到了适配器模式,无论给Adapter什么样的数据,最后到RecyclerView显示的都是View

类适配器模式

类的适配器模式,采用继承实现的

适配器模式.png
  • Target:目标接口,也就是期望得到的接口
  • Adaptee:需要适配的接口
  • Adapter:适配器,负责把Adaptee转换成Target的类

不说远了,就说手机充电头,其实就是一个电源适配器,生活用电的电压是220v,而手机充电的电压是5v,所以这时候就需要使用到电源适配器将220v的电压转换为5v(如果你是直接插在插板的USB接口上的话,当我没说)。

对应上面的UML图, 生活电压就是Adaptee,手机充电电压就是Target,不用多说,电源适配器自然就是Adapter了。

Target给出

//Target接口
public interface Volt5 {
    public int getVolt5();
}

//Adaptee类
public class Volt220 {
    public int getVlot220(){
        return 220;
    }
}

//Adapter类
public class VoltAdapter extends Volt220 implements Volt5 {
    @Override
    public int getVolt5() {
        return 5;
    }
}

public class Client{
    public static void main(String[] args){
        VoltAdapter adapter = new VoltAdapter();
        System.out.println("输出电压:" + adapter.getVolt5());
    }
}

对象适配器模式

与类适配器模式不同的是,对象适配器模式不适用继承关系链接Adaptee类,而是使用代理关系链接到Adaptee

适配器模式.png

这种实现方式直接将要被适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果。比类适配器的实现方式更灵活,还有就是Adaptee对象不会暴露出来,因为没有继承被适配对象。

//Target接口
public interface Volt5 {
    public int getVolt5();
}

//Adaptee类
public class Volt220 {
    public int getVlot220(){
        return 220;
    }
}

//Adapter类
public class VoltAdapter implements Volt5 {

    Volt220 volt220;

    public VoltAdapter(Volt220 volt220){
        this.volt220 = volt220;
    }

    public int getVolt220(){
        return volt220.getVlot220();
    }

    @Override
    public int getVolt5() {
        return 5;
    }
}

public class Client{
    public static void main(String[] args){
        VoltAdapter adapter = new VoltAdapter(new Volt220());
        System.out.println("输出电压:" + adapter.getVolt5());
    }
}

优点

  • 复用性好,当现有的类不符合需求时,通过适配器就可以使这些功能得到更好地复用。
  • 扩展性好,可以更好地扩展系统的功能

缺点

过多的使用,会让代码更加凌乱。

你可能感兴趣的:(【设计模式笔记】(十八)- 适配器模式)