模式定义:
把一个类的接口,变换成客户端所期待的另一种接口,从而使原来因接口不匹配而无法一起工作的两个类能够一起工作,又称为转换器模式、变压器模式、包装模式。
我突然明白了,为什么官方的解释总是那么地抽象,很多时候难以理解。大概是因为他们不仅要从众多的例子中抽象出一个概念,更要适用所有情形。好吧,真是难为他们了。
情景现在有220V的电源,你有12v的笔记本电脑需要充电,但是你没有12v的电源。这时候你需要一个适配器,把220v电源输出的电流转为12v的电流。
220V的电源接口类和实现类(面向接口编程):
public interface power220v {
void outPut220v();
}
public class power220vImpl implements power220v{
@Override
public void outPut220v() {
System.out.println("正在输出220v电流....");
}
}
12v的电源接口:
* 描述:12v电源接口 *作者: aliyu *
创建时间: 2021-10-20 9:25 上午 */ public interface power12v { void outPut12v(); }
类图结构:
这样适配源(220v电源接口和实现),以及适配目标接口都有了(你问为啥没有12v的实现?有了实现就是有12v的电源啊,那还做什么适配?!)
接下来我们开始做适配器。
适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用它包裹对象的物理实体。
适配器代码:
public class ObjectAdapter implements Power12v{
private Power220vImpl power220vImpl;
public ObjectAdapter(Power220vImpl power220vImpl) {
this.power220vImpl = power220vImpl;
}
@Override
public void outPut12v() {
//转换第一步,把220v的电流输出来(转换总得有原材料吧)
power220vImpl.outPut220v();
//模拟转换的过程
System.out.println("开始转换220v的电流为12v....");
//模拟输出转好的电流
System.out.println("转换成功,输出转好的12v电流!!!...");
}
}
ps:我们可以看到,对象适配器模式,相当于适配器初始化时,传入要转化的原料生产者(220V电源)。适配器方法“outPut12v”中:先调用220v电源产生220v电流(作为原料),然后进行转换,最后输出12v电流的过程。
类关系图:
ps:可以看出它们是组合的方式。
测试代码:
public class TestObjectAdapter {
public static void main(String[] args) {
//准备220v的电源
Power220vImpl power220vImpl = new Power220vImpl();
//接上适配器
ObjectAdapter objectAdapter = new ObjectAdapter(power220vImpl);
//输出12v电流
objectAdapter.outPut12v();
}
}
类适配器
类适配器代码:
public class ClassAdapter extends Power220vImpl implements Power12v{
@Override
public void outPut12v() {
//先适配器输入220v的电流
this.outPut220v();
//模拟转换的过程
System.out.println("开始转换220v的电流为12v....");
//模拟输出转好的电流
System.out.println("转换成功,输出转好的12v电流!!!...");
}
}
ps:类适配器,继承适配源类,并实现了适配目标接口。
继承适配源类,使它获得了生产220v电流的方法。
实现目标接口,是为了向外提供输出12v电流的方法。
类关系图:
ps:根据组合优于继承的原则,不推荐这种方式。
当希望将一个类转换为满足另一个新接口的类时,可以使用类的适配器模式。
当希望将一个对象转换成满足另一个新接口的对象,可以使用对象的适配器模式。
具体怎么用,还是得实际情况分析。
其他有的文章还有接口适配器,没有找到太多的资料,有机会再说
参考文献:
JAVA设计模式之适配器模式



