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

适配器模式的理解和示例[通俗易懂]一、是什么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接口时,适配器的用处就来了

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

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

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

(0)
上一篇 2022年7月1日 下午2:36
下一篇 2022年7月1日 下午2:46


相关推荐

  • vpp命令总结_gdb调试命令总结

    vpp命令总结_gdb调试命令总结createsubBondEthernet0834创建子接口,tag是834setinterfaceiptableBondEthernet0.8341将此接口设置在fib1里setinterfaceipaddressBondEthernet0.834192.168.0.250/24设置接口ipsetinterfaces

    2025年7月31日
    8
  • c语言rand函数生成随机数,详解C语言生成随机数rand函数的用法[通俗易懂]

    说到rand函数,大家是不是会和EXCEL中的rand函数混淆,当小编第一次接触的时候也以为是EXCEL的函数,本文是爱站技术频道小编为大家带来的详解C语言生成随机数rand函数的用法,一起来看看吧!函数rand()是真正的随机数生成器,而srand()会设置供rand()使用的随机数种子。如果你在第一次调用rand()之前没有调用srand(),那么系统会为你自动调用srand()。而使用同种子…

    2022年4月18日
    49
  • AWK awk xxx xxx[通俗易懂]

    AWK awk xxx xxx[通俗易懂]awk’BEGIN{a=5;a+=5;printa}’10

    2022年8月22日
    8
  • 数据库设计之概念结构设计工具_数据库关系设计

    数据库设计之概念结构设计工具_数据库关系设计概念模型将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程就是概念结构设计概念模型的特点(1)能真实、充分地反映现实世界,是现实世界的一个真实模型。(2)易于理解,从而可以用它和不熟悉计算机的用户交换意见。(3)易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充。(4)易于向关系、网状、层次等各种数据模型转换描述概念模型的工具E-R模型E-R模型1.实体之间的联系(1)两个实体型之间的联系:①一对一联系(1∶1)②一对多联系(1∶n)③多对多联系(m∶n)

    2022年10月12日
    3
  • tomcat java_tomcat和maven的区别

    tomcat java_tomcat和maven的区别缓存什么是缓存[Cache]存在内存中的临时数据将用户经常查询的数据放在缓存(内存)中,用户去查询数据的时候就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。为什么使用缓存减少和数据库的数据交换次数,较少系统开销,提高系统效率什么样的数据库能使用缓存经常查询并且不经常改变的数据Mybatis缓存MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。默认情况下,只启用了本地的会话缓存,它仅

    2022年8月8日
    6
  • java怎么用_如何使用Java编写程序

    java怎么用_如何使用Java编写程序步骤1:您需要什么:1)一台运行Windows的PC(任何Windows软件将起作用:XP以外的其他软件可能需要稍作修改。请参见下面的链接。)2)Internet连接3)管理能力为了开始编程,我们首先需要下载Java开发套件(JDK)和Java软件。您的计算机可能已经具有JavaRuntimeEnvironment。这通常被称为JRE,或简称Java。这使您可以运行Java程序,但不能对它们进行编…

    2022年7月8日
    23

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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