【定义】
将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以相互合作。这个定义还好,说适配器的功能就是把一个接口转成另一个接口。
【使用场景】
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
3、在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。
其实现方式主要有两种:
1.类的适配器模式(采用继承实现)
2.对象适配器(采用对象组合方式实现)
例子:手机充电器一般都是5V左右吧,咱天朝的家用交流电压220V,所以手机充电需要一个适配器(降压器)
先定义一个手机
package adapter;
public class Mobile {
public void inputPower(V5Power v5Power){
int provideV5Power = v5Power.provideV5power();
System.out.println("我需要5v的电压,现在电压是:"+provideV5Power+"V");
}
}
手机依赖于一个5v的接口
package adapter;
/**
* 提供5v电压的接口
* @author Administrator
*
*/
public interface V5Power {
public int provideV5power();
}
家用的电压提供220v
package adapter;
/**
* 家用220v交流电
* @author Administrator
*
*/
public class V220Power {
public int provideV220Power(){
System.out.println("提供220v交流电");
return 220;
}
}
适配器:将220v转成5v
package adapter;
/**
* 适配器,把220V电压变成5v
* @author Administrator
*
*/
public class V5PowerAdapter implements V5Power{
private V220Power v220Power;
public V5PowerAdapter(V220Power v220Power) {
super();
this.v220Power = v220Power;
}
public int provideV5power() {
v220Power.provideV220Power();
System.out.println("适配器:改变了电压!!!");
return 5;
}
}
测试:给手机充电
package adapter;
public class AdapterTest {
public static void main(String[] args) {
Mobile mobile = new Mobile();
V5Power power = new V5PowerAdapter(new V220Power());
mobile.inputPower(power);
}
}
运行结果:
提供220v交流电
适配器:改变了电压!!!
我需要5v的电压,现在电压是:5V
【小结】
1、适配器模式也是一种包装模式,与之前的 Decorator 装饰模式同样具有包装的功能;此外,对象适配器模式还具有显式委托的意思在里面(其实类适配器也有这种意思,只不过比较隐含而已),那么我在认为它与 Proxy 代理模式也有点类似;
2、从上面一点对比来看, Decorator 、 Proxy、 Adapter 在实现了自身的最主要目的(这个得看各个模式的最初动机、描述)之外,都可以在包装的前后进行额外的、特殊的功能上的增减,因为我认为它们都有委托的实现意思在里面;
3、我所看的书中说适配器模式不适合在详细设计阶段使用它,它是一种补偿模式,专用来在系统后期扩展、修改时所用。
转载出处:http://blog.youkuaiyun.com/lmj623565791/article/details/25833393
http://blog.youkuaiyun.com/ymeng_bupt/article/details/6833480