设计模式之适配器模式

适配器模式简介: 将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

使用场景:
1)系统需要使用现有的类,但现有的类却不兼容。
2)需要建立一个可以重复使用的类,用于一些彼此关系不大的类,并易于扩展,以便于面对将来会出现的类。
3)需要一个统一的输出接口,但是输入类型却不可预知。

角色:
Source:需要被适配的类、接口、对象,即Datas。
Destination:需要得到的类,Source通过适配得到的类对象,也就是我们期待得到的接口。
Adapter:适配器类,协调Source和Destination,使两者能够协同工作。

共有两类适配器模式:
对象适配器模式:
在这种适配器模式中,适配器组合一个被适配类的实例。在这种情况下,适配器调用该实例方法并对方法进行适配.
类适配器模式:
这种适配器模式下,适配器继承需要自已适配的类。

模拟场景:
家用电压为220v而手机充电器大概在5v,需要一个适配器去适配输入电压将220v变为5v。

1)类适配器模式:

被适配的类

/**
 * @Description source类,需要被适配。
 */
public class AC220 {

    public int output220(){
       //输出220v电压
        return 220;
    }

}

目标类:

/**
 * @Description 目标类输出5v电压
 */
public interface OP5 {

      int output5v();
}

适配类:

public class PowerAdapter extends AC220 implements OP5{
    @Override
    public int output5v() {
        System.out.println("适配5v开始");
         int i = output220();
         return i/44;
    }
}

测试类:

  @Test
    public void testClassAdapt(){
        PowerAdapter powerAdapter = new PowerAdapter();
        System.out.println("适配后的输出:"+powerAdapter.output5v());
    }

测试结果

得到5v输入电压。
在这里插入图片描述

由于java是单继承,所以这种通过继承被适配类的方式不太灵活,而且继承会让适配器暴露出被适配类的方法。

2)对象适配器模式

只有适配器类不同

public class PowerAdapter2   implements OP5 {
    public PowerAdapter2(AC220 ac220) {
        this.ac220 = ac220;
    }

    private AC220 ac220;
    @Override
    public int output5v() {
        System.out.println("适配5v开始");
         int i = ac220.output220();
         return i/44;
    }
}

测试类:

  @Test
    public void testObjAdapt(){
        PowerAdapter2 powerAdapter = new PowerAdapter2(new AC220());
        System.out.println("适配后的输出:"+powerAdapter.output5v());
    }

测试结果

结果一致
在这里插入图片描述

这种模式和装饰者模式有点类似,但是装饰者是为了去扩展被装饰者的功能,并且使用者无法感觉到方法被装饰,适配器模式主要为了更好的兼容和扩展,使用者能感受到适配器的存在。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值