一、概述
Adepter模式(适配器模式)又被称为Wrapper模式,Wrapper有包装器的意思。
适配器通常作为一个中间者,用于连接两端的对象。比如:目前墙上的插座提供100V的交流电,但是我们的笔记本电脑只能在12V的直流电下工作,这就需要一个AC适配器,用于转换交流100V为直流12V。
二、角色
- Adaptee(被适配):被适配的方法,在上述的例子中就是“交流100V”的插座。
- Adapter(适配):适配器,用于将交流100V转为直流12V的AC适配器。
- Target(对象):目标对象,就是Adapter服务的对象。本例中即笔记本电脑。
三、种类
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
四、实现
1. 类适配器模式
- Target:需要实现的需求,提供12V直流电。
- Adaptee:现在实际的情况,只可提供100V交流电。
- Adapter:提供100V交流电和12V直流电的转换。
Target
//提供12V直流电
public interface Target {
void offerPower12V();
}
Adaptee
// 被适配者--实际情况,提供100V交流电
public class Adaptee {
public void offerPower100V(){
System.out.println("插座提供100V交流电");
}
}
Adapter
类适配器模式,使用继承的方式实现。
MyACAdapter
需要获取到100V交流电并将其转为12V直流电。因此MyACAdapter
类需要继承Adaptee
类(实际情况)并实现Target
接口(需求)。MyACAdapter
就像是桥梁,连接了Adaptee
和Target
。
public class MyACAdapter extends Adaptee implements Target {
@Override
public void offerPower12V() {
offerPower100V();
// 将100V交流电进行转换
System.out.println("电脑需要12V直流电");
System.out.println("转换100V交流电为12V直流电");
System.out.println("电脑得到12V直流电");
}
}
当MyACAdapter
类中的offerPower12V()
方法被调用时,并不是MyACAdapter
类自己进行处理, 而是将处理交给了Adaptee
类的offerPower100V()
方法。
适配器模式的核心:怎么让适配器能访问到被适配者(Adaptee类)的方法,并将其转换为需要的目标方法。
2. 对象适配器模式
因为我们的核心是让适配器(MyAdapter类)能访问到被适配者(Adaptee类)的方法,并将其转换为需要的目标方法。因此也可以用对象的方式实现。
Target
public abstract class Target {
public abstract void offerPower12V();
}
Adapter
public class MyACAdapter extends Target {
private Adaptee adaptee;
MyACAdapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void offerPower12V() {
// 通过对象调用的方式获取到实际的100V交流电
adaptee.offerPower100V();
// 将100V交流电进行转换
System.out.println("电脑需要12V直流电");
System.out.println("转换100V交流电为12V直流电");
System.out.println("电脑得到12V直流电");
}
}
五、总结
什么时候用Adapter模式
当某些现有的类已经被测试过很好用,bug很少时,我们更愿意将这些类作为组件(Adaptee)重复利用。Adapter会对现有的类进行适配,生成新的类。当产生bug时,我们可以很明确知道bug不在现有的类(Adaptee)中,所以只需要调查Adapter角色的类即可。