适配器模式
结构型模式
可以改变已有类(或外部类)的接口形式
Java中使用组合适配,C++可以来使用继承适配
从模式的定义中,可以看出适配器模式就是用来转换接口的,解决不兼容问题的。
现实生活中最常见的适配器便是电源适配器了,笔记本电源不能直接来接收家用交流强电,这时候就需要电源适配器来将其进行转换为手机用的直流弱电。
这时,家用交流电便是被适配者,电源适配器即为适配器
-
客户(Client):**只能调用目标接口功能,不能直接使用被适配器,但可以通过适配器的接口转换间接使用被适配器。
-
目标接口(Target):**客户看到的接口,适配器必须实现该接口才能被客户使用。
-
适配器(Adapter):**适配器把被适配者接口转换为目标接口,提供给客户使用。
-
被适配者(Adaptee):**被适配者接口与目标接口不兼容,需要适配器转换成目标接口子类,才能被客户使用。
类适配
通过继承
public interface Computer {
void V22();
}
public class Voltage {
public void V220(){
System.out.println("使用220v电压");
}
}
/**
* 类的适配
*/
public class Adapter extends Voltage implements Computer{
@Override
public void V22() {
System.out.println("使用适配器");
super.V220();
}
}
/**
* 运行结果
*
* 使用适配器
* 使用220v电压
*/
public class MainClass {
public static void main(String[] args) {
Computer adapter = new Adapter(new Voltage());
adapter.V22();//使用220v电压
}
}
对象适配
使用组合
public interface Computer {
void V22();
}
public class Voltage {
public void V220(){
System.out.println("使用220v电压");
}
}
/**
* 对象的适配
* 使用组合
*/
public class Adapter implements Computer {
private Voltage voltage;
public Adapter(Voltage voltage) {
this.voltage = voltage;
}
@Override
public void V22() {
System.out.println("使用适配器");
this.voltage.V220();
}
}
/**
* 运行结果
*
* 使用适配器
* 使用220v电压
*/
public class MainClass {
public static void main(String[] args) {
Computer adapter = new Adapter(new Voltage());
adapter.V22();//使用220v电压
}
}
应用场景
- 在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引入新的问题等等。如何最大限度的降低修改面呢?
- Adapter模式就是针对这种养似需求而提出来的。
- Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他,源代码都不会受到影响。