结构型设计模式之适配器模式

1、什么是适配器模式?

当一个类的接口,不满足客户端需要,需要进行拓展或者修改时,在保持原有接口的前提下,增加一个适配层,通过这个适配层,提供客户端需要的接口。

2、为什么要使用适配器模式?

把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。主的目的是兼容性。

3、怎么使用适配器模式?

3.1. 首先介绍一下适配器模式的类型:

  1. 类的适配器模式

  2. 对象的适配器模式

3.2 类的适配器模式:

核心思想:有一个Source类,拥有一个方法需要适配。而目的接口是Target,通过Adapter类,将Source的功能拓展到Target里。

应用场景:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类(Source类),并实现新的接口。

 有一个现有的翻译类(translates),可以将中文转换成英文。现在客户端需要将中文转换成俄文。

public class translates {
    public void translatesZh2En(String input) {
        ... // 已有代码
    }
}

正常的做法是在translates类中新增一个方法(translatesZh2Ru)

public class translates {
    public void translatesZh2En(String input) {
        ... // 已有代码
    }

    public void translatesZh2Ru(String input) {
        ... // 新增代码
    }
}

设计问题:扩展功能却修改了现有的translates类,违反了开闭原则。后续每次新增,都需要修改这个类,如果这个是一个三方件的jar包的源码类,那就更麻烦了。


利用类的适配器模式,采用如下方案实现:创建一个新类(translates2),继承原有的类(translates类),并实现新的接口(translatesInterface)。

public interface translatesInterface {
    public void translatesZh2En(String input);
    public void translatesZh2Ru(String input);
}
public class translates2 extends translates implements translatesInterface {
    public void translatesZh2Ru(String input) {
        ... // 新增代码
    }
}

方案的关键点:

  • 新增接口类translatesInterface,对外提供统一接口;
  • 新增translates2类,继承现有的translates类及translatesInterface接口,实现指纹认证功能;
 

 优点:

  • 无需改动现有业务类;
  • 可复用现有业务类;
  • 可灵活扩展;

 3.3 对象的适配器模式:

核心思想:基本思路和类的适配器模式相同,只是将Adapter类作修改继承Source类,而是持有Source类的实例,以达到解决兼容性的问题

应用场景:当希望将一个类转换成满足另一个新接口的类时,可以创建一个Wrapper类,持有原有类的一个实例,在Wrapper类的方法中,调用实例的方法。

 还是上面的那个翻译类(translates),可以将中文转换成英文。现在客户端需要将中文转换成俄文,需要怎么用对象的适配器模式呢?

public class translates {
    public void translatesZh2En(String input) {
        ... // 已有代码
    }
}

 

利用对象的适配器模式,采用如下方案实现:创建一个新类(Wrapper),持有原有的类的一个实例(translates实例),调用实例的方法即可。

public class Wrapper{
    private translates translates;

    public Wrapper(translates translates) {
        this.translates= translates;
    }

    public void translatesZh2En(String input){
        translates.translatesZh2En(input);
    }
    public void translatesZh2Ru(String input){
        ... // 新增代码
    }
}


public class translates {
    public void translatesZh2En(String input) {
        ... // 已有代码
    }
}

方案的关键点:

  • 新增Wrapper类,持有原有类(translates)的实例。
  • 在Wrapper类中,调用原有类(translates)的方法。
 

 跟类的适配器模式相比的优点:

  • 没有使用java的继承,有更多的拓展性。
  • “合成复用原则”,在系统中尽量使用关联关系来替代继承关

更多内容请关注微信公众号“外里科技

官方公众号外里科技
运营公众号英雄赚
微信wxid_8awklmbh1fzm22
QQ1247408032
开源代码https://gitee.com/B_T/beimi

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值