对于设计模式之适配器模式的总结

一:概念

把一个类的接口变成客户端所期待的另一种接口,使原本接口不兼容的两个类,可以一起工作。一般逻辑是将自己不兼容的接口,包裹在一个类里面,而该类就是适配器。简单来说,就是将源角色的api通过适配器,适配为目标角色的api

二:适配器模式角色

    适配器模式的角色有三种,分别是源角色,适配器角色以及目标角色。正是适配器角色将源角色的api,适配为目标角色的api。

三:java中适配器模式的实现(三种)

    1.类适配器模式(适配器继承被适配的类)

           

/**
能输出220v电压的类
**/
publicclass Output220v{

    public int output220V(){
        return 220;
    }
    
}

/**
    适配器继承被适配的类,提供输出22v的电压功能
**/
public  class Adapter extends Output220v{
    public int output22v(){
        return output220v()/10;
}
    
   
}
/**
    使用时,通过适配器,就可以把原本只能输出220v的类输出22v
**/
   new Adapter().outPut22v()
}

  

优点:适配器是被适配类的子类,因此,适配器继承的被适配类的所有方法,并且可以进行重写

缺点:局限于单继承,适配器只能继承一个父类,所以只能为一个类进行适配

    2.对象适配器(适配器持有被适配类的实例对象)

           

/**
能输出220v电压的类
**/
publicclass Output220v{

    public int output220V(){
        return 220;
    }
    
}

/**
    适配器继承被适配的类,提供输出22v的电压功能
**/
public  class Adapter{

    private Output220v output220v;

    public Adapter(Output220v output220v){
       this.output220v = output220v;
}
    public int output22v(){
        return output220v.output220v()/10
}
    
   
}
/**
    使用时,通过适配器,就可以把原本只能输出220v的类输出22v
**/
   new Adapter(new Output220v()).outPut22v()
}

  

        优点:与类适配器相比,对象适配器通过对象的持有引用,把由原本的继承关系变为了聚合关系

        缺点:不易重写被适配类的方法

    3.接口适配器(通过抽象适配器实现某个接口,再通过自定义适配器继承抽象适配器,自定义实现接口的某个方法即可)

           

/**
能输出电压的接口
**/
public interface Output{

    public int output220V();
    public int output110V();
    public int output55v();
    public int output10v();
}

/**
    抽象适配器提供Output的相应方法的默认实现,把核心方法交由子类去实现;
    
**/
public abstract class AbstractAdapter implements Output{
    @Override
    public int output220v(){};
    @Override
    public int output110v(){};
    @Override
    public int output55v(){};
    @Override
    public int output10v(){};
    
   
}
/**
    使用时,可以自定义一个类(外部类或者内部类)来重写抽象父类对应的某个核心方法,假设需要一个输出220V电压的适配器
**/
   Output adapter =  new AbstractAdapter(){
    //重写接口的某个方法,在这里可以完成适配,即调用另外一个接口的方法
    @Override
    public int output220v(){...}
}
    adapter.oupt220v();

  

 优点:可以直接适配接口及具体的接口方法,非常灵活

缺点:过多的使用适配器,会让系统非常零乱,如明明调用的是A接口,但是却被适配成了B接口的实现,不易于后期的维护

四:使用场景

        1.系统需要使用现有的类,但是现有的类不兼容

        如接口的新老版本参数不一致,但是老版本依然在用,此时就可以定义一个适配器,把老版本接口与新版本接口进行适配(通过适配器封装起来即可)

        2.需要建立一个可重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便面对将来会出现的情况

        如安卓开发中的RecycleView与ListView都需要一个适配器来适配数据源,安卓框架中提供了BaseAdapter来供开发者扩展,开发者可自定通过继承BaseAdapter来自定义适配器,适配不同的数据源,完成对视图的数据填充

        3.需要一个统一的输出接口,但是输入类型不知道

        如Spring的HandlerAdapter,HandlerAdapter是Handler的适配器,其中RequestMappingHandlerAdapter是RequestMappingHandler的适配器。其handle()方法底层封装了RequestMappingHandler的方法。RequestMappingHandler处理的是使用@RequestMapping注解来映射请求信息的handler。handler的输入参数个数。类型以及返回值等都是不确定的,所以可以通过一个Adapter来统一处理,把HttpRequest与HttpResponse适配成@RequestMapping标注的handler可以处理的入参,返回值等(实际就是封装入参,处理返回值等)

 五:适配模式与代理模式的区别

        适配模式与代理模式对外暴露的都不是真实的类,如代理模式中对外暴露的是代理类,代理类代理了真实的方法;适配器模式中与外界接触的是适配器,同样隐藏了真实的被适配的类。但是两者还是有很明显的区别的

        代理模式主要是对功能的增强,目的是做到调用者无感知自己的操作使用了代理,这也就要求代理类调用代理方法时,方法名以及方法入参等都是必须是一致的(仅仅是对原方法插入了一些通知)。

        而适配器模式只要是对不同情况进行适配,使得外界情况与真实对象适配,方法入参,方法名等没有特点的要求(比如当方法参数个数不同时,可以适配成方法参数一样)

        简单来说:代理模式就是为了真实对象在同一场景下,对特定功能的增强(如登录场景下增加登录校验功能),而适配器模式为了真实对象对不同场景的适配,(如新老接口不兼容问题,老接口的某个接口方法需要传3个参数,而新接口只需要传2个参数),例如Spring的HandlerAdapter就是为了解决handler类型不同的适配器

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值