适配器模式

概念:把现有的一个类的接口转化为客户端期望的另一种接口,使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

优点:
1.可以让任何没有关联的两个类一起运行。
2.提高了类的复用。
3.增加了类的透明度。
4.灵活性好。
缺点:
过多的使用适配器,会让系统非常零乱。

适配器模式分为主要分为类适配器模式对象适配器模式

uml图:
适配器模式_第1张图片

适配器模式_第2张图片

目标角色(Target):,期望得到的接口;
源角色(Adaptee):现在已经有的类,需要适配的接口;
适配器角色(Adapter):把源接口转换为目标接口;

类适配器模式和对象适配器模式在形式上的区别是,类适配器模式对源角色采用了继承,而对象适配器模式对源角色采用的是调用。
举一个网上买的Type-c耳机转接头的例子, 设置一个适配器将Type-c接口转换为耳机的圆口。
适配器模式_第3张图片

先写一下类适配器模式:

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需要实例化源角色对象,建议尽量使用对象的适配器模式,多用合成/聚合、少用继承。

你可能感兴趣的:(适配器模式)