适配器模式

概念

适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。

适配器模式(Adapter)的定义:将一个接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如:

  • 讲中文的人同讲英文的人对话时需要一个翻译
  • 直流电的笔记本电脑交流电源时需要一个电源适配器
  • 用计算机访问照相机的SD内存卡时需要一个读卡器等。

在软件设计中也可能出现:需要开发的具有某种业务功能的组件,在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。

对象适配器

实现时使用了构成原则:适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。

对象适配器实例

直流电的笔记本电脑交流电源时需要一个电源适配器

package structural.object_adapter;

/**
 * Source类
 */
public class AC220V {
    public int output220V() {
        return 220;
    }
}

目标类Destination:

package structural.object_adapter;

public interface DC5V {
    int output5V();
}

适配器:

package structural.object_adapter;

public class PowerAdapter implements DC5V {
    /**
     * 封装AC220V
     */
    private AC220V ac220V;

    public PowerAdapter(AC220V ac220V) {
        this.ac220V = ac220V;
    }

    /**
     * 实现DC5V接口
     */
    @Override
    public int output5V() {
        int output = 0;
        if (ac220V != null) {
            output = ac220V.output220V() / 44;
        }
        return output;
    }
}

客户使用:

package structural.object_adapter;

public class Client {
    public static void main(String[] args) {
        // 用户需将适配器插入220V的插座上
        DC5V dc5V = new PowerAdapter(new AC220V());
        System.out.println(dc5V.output5V());
    }
}

类适配器

这一实现使用了继承机制适配器同时继承两个对象的接口。这种方式仅能在支持多重继承的编程语言中实现,例如 C++。

类适配器实例

直流电的笔记本电脑交流电源时需要一个电源适配器

package structural.class_adapter;
// Source类
public class AC220V {
    public int output220V() {
        return 220;
    }
}

目标类Destination:

package structural.class_adapter;

public interface DC5V {
    int output5V();
}

适配器:

package structural.class_adapter;

public class PowerAdapter extends AC220V implements DC5V {
    @Override
    public int output5V() {
        return output220V() / 44;
    }
}

客户使用:

package structural.class_adapter;

public class Client {
    public static void main(String[] args) {
        PowerAdapter adapter = new PowerAdapter();
        System.out.println(adapter.output5V());
    }
}
posted @ 2021-03-12 10:35  chenzufeng  阅读(82)  评论(0编辑  收藏  举报