设计模式-适配器模式(Adapter Pattern)
Posted 涂程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-适配器模式(Adapter Pattern)相关的知识,希望对你有一定的参考价值。
定义
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用场景
原本由于接口不兼容而不能一起工作的那些类可以在一起工作.
生活中的手机充电器就是一个适配器的例子,手机一般都是在5V的电压下进行充电,但是外部的电压都是220V,那怎么办,这就需要充电器去适配了,将220V的电压转换为5V。
优缺点
优点:
1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用。
3、增加了类的透明度。
4、灵活性好。
缺点:
1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
具体实现
1. 创建适配器接口
现在我们需要定义一个220V转换成5V的接口:
interface Adapter {//适配器类
int convert_5v();//装换成5V
}
2. 创建被适配角色
被适配角色,一般是已存在的类,需要适配新的接口。生活中的220V电源无处不在:
public class Electric {// 电源
public int output_220v() {//输出220V
return 220;
}
}
3. 创建具体适配器
我们需要一个具体适配器,这个适配器就是变压器,能够将220V转为5V输出:
public class PhoneAdapter implements Adapter {//手机适配器类
private Electric mElectric;//适配器持有源目标对象
public PhoneAdapter(Electric electric) {//通过构造方法传入对象
mElectric = electric;
}
@Override
public int convert_5v() {
System.out.println("适配器开始工作:");
System.out.println("输入电压:" + mElectric.output_220v());
System.out.println("输出电压:" + 5);
return 5;
}
}
4. 客户端测试:
public class Test {
public static void main(String[] args) {
Electric electric = new Electric();
System.out.println("默认电压:" + electric.output_220v());
Adapter phoneAdapter = new PhoneAdapter(electric);//传递一个对象给适配器
System.out.println("适配转换后的电压:" + phoneAdapter.convert_5v());
}
}
输出结果:
默认电压:220
适配器开始工作:
输入电压:220
输出电压:5
适配转换后的电压:5
other
这里实现的例子只是适配器模式其中的一种,其实适配器模式分为
- 对象适配器模式
- 类适配器模式
这里我们讲的是对象适配器的实现,类适配器的原理差不多的,只是类适配器模式没什么优势,用得比较少,这里就不做详细讲解了。
接下来把他们做一下对比:
- 类适配器采用了继承的方式来实现;而对象适配器是通过传递对象来实现,这是一种组合的方式。
- 类适配器由于采用了继承,可以重写父类的方法;对象适配器则不能修改对象本身的方法等。
- 适配器通过继承都获得了父类的方法,客户端使用时都会把这些方法暴露出去,增加了一定的使用成本;对象适配器则不会。
- 类适配器只能适配他的父类,这个父类的其他子类都不能适配到;而对象适配器可以适配不同的对象,只要这个对象的类型是同样的。
- 类适配器不需要额外的引用;对象适配器需要额外的引用来保存对象。
最后分享一下我整理的一些Android 相关学习知识点,大家可以点击下方小卡片进行查看。
以上是关于设计模式-适配器模式(Adapter Pattern)的主要内容,如果未能解决你的问题,请参考以下文章