概念:把现有的一个类的接口转化为客户端期望的另一种接口,使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
优点:
1.可以让任何没有关联的两个类一起运行。
2.提高了类的复用。
3.增加了类的透明度。
4.灵活性好。
缺点:
过多的使用适配器,会让系统非常零乱。
适配器模式分为主要分为类适配器模式、对象适配器模式。
uml图:
目标角色(Target):,期望得到的接口;
源角色(Adaptee):现在已经有的类,需要适配的接口;
适配器角色(Adapter):把源接口转换为目标接口;
类适配器模式和对象适配器模式在形式上的区别是,类适配器模式对源角色采用了继承,而对象适配器模式对源角色采用的是调用。
举一个网上买的Type-c耳机转接头的例子, 设置一个适配器将Type-c接口转换为耳机的圆口。
先写一下类适配器模式:
package adapter;
public interface TargetCylinder {
//目标接口是期望转换为圆筒
public String convertCylinder();
}
package adapter;
public class AdapterTypeC {
//被适配类,Type_c接口
public String typyC(){
return "Type_c接口";
}
}
package adapter;
public class HeadsetAdapter extends AdapterTypeC implements TargetCylinder{
//耳机适配器,将Type_c接口转换为圆筒接口
@Override
public String convertCylinder(){
return "将"+super.typyC()+"转化为"+super.typyC().replace("Type_c接口","圆筒");
}
}
package adapter;
public class Client {
public static void main(String[] args) {
//测试,是否转换
HeadsetAdapter headsetAdapter=new HeadsetAdapter();
System.out.println(headsetAdapter.convertCylinder());
}
}
输出:
将Type_c接口转化为圆筒
下面是对象适配器的实现方法:(主要是适配器类中代码不一样,其他都一样,所以我就只贴HeadsetAdapter
类中的代码了)
package adapter;
public class HeadsetAdapter implements TargetCylinder{
//耳机适配器,将Type_c接口转换为圆筒接口
private AdapterTypeC adapterTypeC;
public HeadsetAdapter(AdapterTypeC adapterTypeC){
this.adapterTypeC=adapterTypeC;
}
@Override
public String convertCylinder(){
return "将"+adapterTypeC.typyC()+"转化为"+adapterTypeC.typyC().replace("Type_c接口","圆筒");
}
}
package adapter;
public class Client {
public static void main(String[] args) {
//测试,是否转换
HeadsetAdapter headsetAdapter=new HeadsetAdapter(new AdapterTypeC());
System.out.println(headsetAdapter.convertCylinder());
}
}
输出;
将Type_c接口转化为圆筒
类适配器模式中耳机适配器HeadsetAdapter
需要继承源角色, 对象适配器模式中耳机适配器HeadsetAdapter
需要实例化源角色对象,建议尽量使用对象的适配器模式,多用合成/聚合、少用继承。