适配器模式的理解和示例[通俗易懂]

适配器模式的理解和示例[通俗易懂]一、是什么1.定义:让原来不兼容的两个接口协同工作2.分类:类适配器、对象适配器、接口适配器3.角色目标接口:Target,该角色把其他类转换为我们期望的接口被适配者:Adapte

大家好,又见面了,我是你们的朋友全栈君。

一、是什么

1. 定义:让原来不兼容的两个接口协同工作

2. 分类: 类适配器、对象适配器、接口适配器

3. 角色

  • 目标接口:Target,该角色把其他类转换为我们期望的接口
  • 被适配者: Adaptee 原有的接口,也是希望被改变的接口
  • 适配器: Adapter, 将被适配者和目标接口组合到一起的类

4. 类图

对象适配器,使用组合

适配器模式的理解和示例[通俗易懂]

类适配器,在java中实现不了,需要多重继承才能实现,类图是这个样子的,当然如果变通一下,Target是接口就可以了

适配器模式的理解和示例[通俗易懂]

接口适配器 抽象方法

适配器模式的理解和示例[通俗易懂]

接口适配器的使用场景: 原有接口有很多方法,而我们只需要其中一部分,这是看可以用抽象类来实现该接口,不需要的方法只需要写个空方法(默认实现)就好了,接口目标类去实现自己需要的接口

适用的场景是不想实现原有类的所有方法

二、示例

  • 背景:买了一个进口笔记本电脑
  • 冲突:笔记本电脑需要的三项电源,和只提供的二项电源冲突
  • 解决方案:设置一个适配器二项充电口转化为三项充电口

2.1.1 Adaptee 原有的类 提供二项电

/**
 * 插头 二项供电 Adaptee
 */
public class TwoPower {

    public void powerByTwo() {
        System.out.println("提供二项供电");
    }
}

 2.1.2 Target 目标类  能输出三项供电

/**
 * 插头提供三项供电 (target)
 */
public interface ThreePower {

    /**
     * 三项供电
     */
    void powerByThree();
}

2.1.3 对象适配器,转换类 Adapter

/**
 * 二项转三项的适配器  组合的方式  对象适配器
 */
public class TwoToThreeAdapter implements ThreePower{

    /**
     * 使用委托来完成适配 */
    private TwoPower twoPower;

    public TwoToThreeAdapter(TwoPower twoPower) {
        this.twoPower = twoPower;
    }


    @Override
    public void powerByThree() {
        System.out.println("借助组合适配器转化二项电");
        twoPower.powerByTwo();
    }
}

2.1.4 类适配器 转换类 Adapter

/**
 *  二项转三项的适配器  继承的方式  类
 */
public class TwoToThreeAdapter2 extends TwoPower implements ThreePower {


    @Override
    public void powerByThree() {
        System.out.println("借助继承适配器转化二项电");
        this.powerByTwo();
    }
}

测试

/**
 * 笔记本电脑 这是使用组合模式的-适配器模式
 */
public class NoteBook {

    /**
     * 期望的三项供电接口
     */
    private ThreePower threePower;

    public NoteBook(ThreePower threePower) {
        this.threePower = threePower;
    }


    public static void main(String[] args) {
        // ============================ 继承方式的适配器使用 类适配器 =====================================
        ThreePower threePower1 = new TwoToThreeAdapter2();
        NoteBook noteBook1 = new NoteBook(threePower1);
        noteBook1.recharge();
        noteBook1.work();

        // ============================ 组合方式的适配器使用 对象适配器 =====================================
        // 现在只有二项供电
        TwoPower twoPower = new TwoPower();
        ThreePower threePower = new TwoToThreeAdapter(twoPower);
        NoteBook noteBook = new NoteBook(threePower);
        // 1. 充电
        noteBook.recharge();
        // 2. 工作
        noteBook.work();
    }

    public void work() {
        System.out.println("笔记本电脑开始工作!");
    }

    public void recharge() {
        // 使用三项充电
        threePower.powerByThree();
    }
}

控制台显示:

  提供二项供电
  借助继承适配器转化二项电
  笔记本电脑开始工作!

  提供二项供电
  借助组合适配器转化二项电
  笔记本电脑开始工作!

三、总结

适配器好处

  • 重用
    • 复用的现存的类, 解决了现存类和复用环境要不一致的问题
  • 低耦合
    • 无需修改原有代码(遵循开闭原则)

这里说些缺点吧,过多的使用适配器,的确会让程序看起来很难懂,我的理解是,在适配别人接口和其他API接口时,适配器的用处就来了

适配器模式的理解和示例[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154664.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 什么是JDBC?「建议收藏」

    什么是JDBC?「建议收藏」  一、概念    1、什么是JDBC?    JDBC(JavaDataBaseConnectivity,java数据库连接)是一种用于执行SQL语句的JavaAPI,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据    此可以构建更高级的工具和接口,使数据库开发者能够编写数据库的程序。简单地说,JDBC可做三件事:与…

  • Eclipse配置android开发环境详解「建议收藏」

    本文引自https://blog.csdn.net/dr_neo/article/details/49870587(只是做一个笔记,若原博主不同意请通知与我)第一步、安装JDK;第二步、安装Eclipse;第三步、下载并安装AndroidSDK;第四步、为Eclipse安装ADT插件 下面详细介绍。第一步、安装JDKAndroid开发工具要求必须安装JDK(JavaDevelopmentKit)…

  • FilterRegistrationBean_hid event filter

    FilterRegistrationBean_hid event filter3.4  Struts 2的基本流程 经过前面介绍,我们已经基本了解了Struts 2框架的MVC实现。大致上,Struts 2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 3.4.1  核心控制器:Filte

  • 使用Redis实现优先级队列

    使用Redis实现优先级队列优先级队列是一种如先进先出队列和堆栈数据结构的抽象数据类型。所不同的是每一个元素关联一个“优先级”。优先级高的元素比优先级低的元素优先得到处理。本文讲解如何基于Redis的SORTEDSET数据类型实现优先级队列。SORTEDSET中元素关联一个SCORE,可以按SCORE有序查询元素。优先级队列基本操作实现如下:is_empty:查看队列是否为空。使用EXISTS命…

  • iptables 开放防火墙端口

    iptables 开放防火墙端口总所周知,远程访问centos服务的时候,都要开放相应服务的端口。下面就来说道说道。存在的问题一般情况下,centos下都会存在一个/etc/sysconfig/iptables文件,该文件是用来记录要开放的端口ip的。当然,也不排除新安装的centos,空空如也缺失的,此时就无法执行serviceiptablesrestart。如果你的centos中能正常运…

    2022年10月19日
  • 7本免费的Java电子书和教程

    7本免费的Java电子书和教程本文由ImportNew-唐小娟翻译自Javapapers。欢迎加入翻译小组。转载请见文末要求。1.ThinkinginJava(ThirdEdition)本书的作者是BruceEckel,它一直都是Java最畅销的免费电子书。这本书可以帮助你系统的学习Java,里面包含有很多好的代码示例。第三版仍旧是免费的,直到第四版才开始收费,不过仍旧值得买一本收藏。Think…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号