吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1786|回复: 4
收起左侧

[Java 转载] 正确的运用适配器模式,让你的工作量至少减轻一半

  [复制链接]
hijackking 发表于 2021-8-2 18:51
本帖最后由 hijackking 于 2021-8-2 19:45 编辑

一、介绍适配器模式,顾名思义,就是将一个类的接口转换成客户希望的另一个接口,使接口不兼容的类可以一起工作,也被称为包装器模式(Wrapper)。在适配器模式中,通常通过增加一个新的适配器类来解决接口不兼容的问题,使得原本没有任何关系的类可以协同工作。从设计的角度看,适配器模式涉及到三个角色:
  • 适配器类:适配器类可以调用另一个接口,从而实现接口的转换;
  • 被适配类:被适配类定义了一个已经存在的接口,这个接口需要适配;
  • 客户角色:客户类提出使用具体类的请求;
二、示例在 java 中,适配器模式有两种,类适配器和对象适配器,下面我们一起来看看!
2.1、类适配模式首先,我们创建一个接口Phone,接口的实现类为HuaweiPhonepublic interface Phone {

[Java] 纯文本查看 复制代码
    void productPhone();
}
public class HuaweiPhone implements Phone {

    @Override
    public void productPhone() {
        System.out.println("生产一部华为手机");
    }
}

在创建另一个接口Player,如果Player的实现类想调用HuaweiPhone中的productPhone方法,该怎么办呢?最简单的方法,就是将productPhone的方式逻辑抄一遍,但是这种方法显然不高效!可以通过创建一个适配器ExpensiveAdapter,使之继承HuaweiPhone,来解决接口转换的问题,如下:public class ExpensiveAdapter extends HuaweiPhone implements Player {

    @Override
    public void action() {
  //调用HuaweiPhone中的productPhone方法
        productPhone();
        System.out.println("用手机播放音乐");
    }
}
测试类如下:public class AdapterClient {

    public static void main(String[] args) {
        ExpensiveAdapter adapter = new ExpensiveAdapter();
        adapter.action();
    }
}
即可实现接口的转换!但是这种方法,也有很大的局限性,假如Phone接口的实现类有多个呢?我们知道,类是无法多继承的,对象适配模式就派上用场了!
2.2、对象适配模式同样的,我们可以对ExpensiveAdapter类进行一定的优化,如下:public class ExpensiveAdapter implements Player {

    private Phone phone;

    public ExpensiveAdapter(Phone phone) {
        this.phone = phone;
    }

    @Override
    public void action() {
        //调用Phone接口中的productPhone方法
        phone.productPhone();
        System.out.println("用手机播放音乐");
    }
}
测试客户端如下:public class PlayerClient {

    public static void main(String[] args) {
  //对象适配
        ExpensiveAdapter adapter = new ExpensiveAdapter(new HuaweiPhone());
        adapter.action();
    }
}
相比类适配模式,有木有发现对象适配模式更加灵活~
三、应用在 jdk 中,适配器设计模式应用也非常广泛,例如我们熟悉的io包,其中字节流转字符流,就使用到了适配器模式!
其中,最广泛的莫过于Spring中的ioc对象依赖关系,在类A中,通过引入另一个类B 对象,就可以调用类 B 中的方法了,从而实现方法的协同工作!

四、总结适配器模式,可以让任何两个没有关联的类一起运行,提高了类的复用;例如,现在非常流行的Mybatis-plus持久框架,里面的Service层就是典型的类适配模式,在Service层可以很方便的进行crud调用,开发人员基本不需编写crud的代码,开发效率大大提升!但是,设计时如果过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是另一个接口,反而另一个接口又回调了自身,一个系统如果太多出现这种情况,无异于一场灾难。因此在设计使用的时候,尽可能层次分明,接口名包括方法名,取名的时候应该规范化定义!
640 (1).jpg
640 (1).jpg

免费评分

参与人数 1热心值 +1 收起 理由
youya123 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

18898589561 发表于 2021-8-2 19:05
我很赞同!
junyu168 发表于 2021-8-2 19:40
EAming 发表于 2021-8-2 21:41
bandishui 发表于 2021-8-3 10:27
简单看看
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-4 12:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表