目的:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
----- 尽量优先使用Object Adapter的模式。
意图:
# 你想使用一个已经存在的类,而它的接口不符合你的需求。
# 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
# (仅适用于对象A d a p t e r )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
(目的和意图是不变的,摘自《设计模式迷你手册》电子版)
原理:
保留现有的类所提供的服务,修改其接口,从而达到客户端的期望。
特征:
目标角色、(适配源)源角色、适配器、用户角色
实例:
比如,你买了个二手手机,没有充电求,以前的充电器是110V的,而新买的手机是220V充电的,这时你就可以弄个电源适配器来转换得到220V电源。
目标角色:220V电压;(适配源)源角色:110V电压;适配器:电源适配器;用户角色:你
代码如下:
//源角色(适配源)
public class Adaptee {
public void getV110(){
System.out.print(this.getClass().getName()+":");
System.out.println("我能用110V电压充电");
}
}
//目标角色
public interface Target {
public void getV220();
}
//适配器角色
public class Adapter extends Adaptee implements Target{
@Override
public void getV220() {
// TODO Auto-generated method stub
System.out.print(this.getClass().getName()+":");
System.out.println("我能用220V电压充电");
}
}
//执行角色
public class Hello {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("没有适配器之前");
Adaptee adaptee=new Adaptee();
adaptee.getV110();
System.out.println("用了适配器之后");
Adapter adapter=new Adapter();
adapter.getV110();
adapter.getV220();
}
}
其实适配器在实际编程中应用非常广泛,有类适配模式和对象适配模式两种,两者还是有点区别的,同志们具体情况具体分析吧。
--类适配器使用继承关系复用适配源(Adaptee),因此目标(Target)不能是类,只是能接口(java单继承)。
--对象适配器使用委派关系复用适配源(Adaptee),因此目标(Target)可能是类或接口,可以将多个适配源适配到一个目标接口。