本文详细介绍两种实现适配器方式、应用场景及对比
简介
Adapter模式-适配器模式,是构造型模式之一
通过Adapter模式可以改变已有类(或外部类)的接口形式,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。
很容易想到usb接口(2.0、3.0等),电源适配器等等生活中很多例子
应用场景
大规模系统开发中,我们实现某些功能但不成熟,但重新开发会消耗大量时间,所以先暂时使用,以后考虑随时替换。而到了给他替换的时候,需要对引用该外部组件的源码大面积修改。因此已带来了很多问题。那么适配器模式就是针对此场景提出。
通过定义一个新的接口(对需要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)来透明的调用外部组件。这样替换外部组件时,最多只需要修改几个Adapter类就可以,其他源代码不会受到影响。
具体场景如:
为未来预留更换下游方法实现的适配器,也就是先适配不完善的功能,之后更完善的功能出来后,转换适配。
需要一个统一的输出接口,而输入端的类型不可预知。
- 通过接口转换,将一个类插入另一个类系中。增强另一个类系的功能。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。比喻来源-菜鸟教程)
- 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式
- 适配器不是在具体设计时使用,而是解决已经上线的项目的接口升级等问题
结构图
继承实现Adapter
委让实现Adapter
实现
被适配的对象
package com.mym.designmodel.adapter;
public class Current {
public void use220V(){
System.out.println("使用220v");
}
}
继承实现Adapter
package com.mym.designmodel.adapter;
/**
* 职责:继承式适配器。
*/
public class Adapter extends Current {
/**适配方法*/
public void use180v(){
System.out.println("使用继承式适配器!");
this.use220V();
}
}
委让实现Adapter
package com.mym.designmodel.adapter;
/**
* 职责:适配器。委让式适配器。
*/
public class Adapter2 {
Current current = null;
public Adapter2(Current current){
this.current = current;
}
public void use15v(){
System.out.println("使用委让式适配器!");
current.use220V();
}
}
客户端测试
package com.mym.designmodel.adapter;
/**
* 职责:客户端。测试
*/
public class MainClass {
public static void main(String[] args) {
// 未使用适配器
Current current = new Current();
current.use220V();
System.out.println("-----------------------------");
// 继承式适配器
Adapter adapter = new Adapter();
adapter.use180v();
System.out.println("-----------------------------");
// 继承式适配器
Adapter2 adapter2 = new Adapter2(new Current());
adapter2.use15v();
}
}
适配器优缺点及两种适配方式对比
优点
- 1、可以让任何两个没有关联的类一起运行。
- 2、提高了类的复用。
- 3、增加了类的透明度。
- 4、灵活性好。
缺点
- 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构
两种适配方式对比
- 两方式都是为更换真实方法实现提供一种机制。但继承式的本就具有java单继承的局限
- 委让式就是拥有老方法的引用,灵活性较高,比较推荐
- 使用时仍然需要根据系统功能适配场景选用,相关可参考
应用场景
小节