初识设计模式-适配器模式

适配器在生活中经常见到,如手机、笔记本电脑的电源适配器,USB 转接头都是常见的适配器。

在设计模式当中,适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

在类适配器模式中,适配器与适配者之间是继承(实现)关系;在对象适配器模式中,适配器与适配者之间是关联关系。

具体实现

典型的类适配器模式代码示例如下:

class Adapter extends Adaptee implements Target {
    public void request() {
        // 转发调用
        super.specificRequest();
    }
}

从上述的代码可以看出,典型的类适配器模式就是通过继承的方式,使用子类方法调用父类的方法,使用者在使用时面对的是适配器类而不是原始类。

典型的对象适配器模式代码示例如下:

class Adapter extends Target {
    // 维持一个对适配者的引用
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        // 转发调用
        adaptee.specificRequest();
    }
}

代理、桥接、装饰器、适配器的区别

笼统地说,这 4 种设计模式可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。

尽管它们的代码结构类似,但这 4 种设计模式的用意完全不同,以下是它们简要描述:

  • 代理模式:代理类在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它与装饰器模式最大的不同
  • 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变
  • 装饰器模式:装饰器模式在不改变原始类接口的情况下,对原始类功能进行加强,并且支持多个装饰器的嵌套使用
  • 适配器模式:适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口,适配器模式是一种事后的补救策略

适配器模式的主要优点如下:

  • 将目标类和适配者类解耦
  • 增加了类的透明性和复用性
  • 灵活性和扩展性都非常好

除上述以外,对象适配器模式还有以下优点:

  • 一个对象适配器可以把多个不同的适配器适配到同一个目标
  • 可以适配一个适配者的子类

类适配器模式的主要缺点如下:

  • 对于不支持多重继承的编程语言,一次最多只能适配一个适配者类,不能同时适配多个适配者
  • 适配者类必须是可被继承的
  • 对于不支持多重继承的编程语言,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性

对象适配器模式的主要缺点如下:

  • 与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦

适配器模式的适用场景如下:

  • 封装有缺陷的接口设计
  • 统一多个类的接口设计
  • 替换依赖的接口设计
  • 兼容老版本接口
  • 适配不同格式的数据

在 Java 中,SLF4J 日志框架不仅仅提供了统一的接口定义,还提供了针对不同日志框架的适配器。对不同日志框架的接口进行二次封装,适配成统一的 SLF4J 接口定义。

Original: https://www.cnblogs.com/fatedeity/p/16743683.html
Author: 程序员翔仔
Title: 初识设计模式-适配器模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587393/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 二分图最大匹配

    大佬的详细解释:https://www.cnblogs.com/zzh666/p/9038299.html 这里我们来介绍一种求二分图最大匹配的算法—— 匈牙利算法: 我们可以这样…

    数据结构和算法 2023年6月7日
    093
  • 【ACM】2022.7.31训练赛

    A.Arena CodeForces – 1487A 题目描述 $ n $ heroes fight against each other in the Arena. …

    数据结构和算法 2023年6月8日
    053
  • 随笔1

    今后会陆续把我写得随笔发上来吖 可能有些粗拙… 吾辈当自强 不经意间,脑海里闪过大海的壮阔。我喜欢看海,只因这是祖国的造物。海之蓝,美好,纯洁,我的中国梦就如同茫茫大海…

    数据结构和算法 2023年6月7日
    073
  • 莫队

    莫队 两只小手跳来跳去 众所周知,莫队算法是由莫涛大神总结的一种短小精悍的离线暴力维护区间操作的算法。 因其简短的框架,简单好记的板子和优雅的时间复杂度而闻名。 莫队题单 普通莫队…

    数据结构和算法 2023年6月12日
    064
  • DP 做题记录

    (Problem:)你有 (A) 枚正能量骰子,(6) 个面分别显示的是 ([+1, +6]) 的值。你有 (B) 枚负能量骰子,(6) 个面分别显示的是 ([-6, -1]) 的…

    数据结构和算法 2023年6月12日
    075
  • Html飞机大战(二):面向对象绘制背景

    好家伙, 我们为了后续工作的顺利进行,我试着把每一个模块封装为对象 但冻手之前还是要构思一下 我们把天空封装成一个类: 1.来搞一手简单的对象分析: 属性方面的都好理解 来说明一下…

    数据结构和算法 2023年6月8日
    075
  • MySQL InnoDB缓存

    1. 背景 对于各种用户数据、索引数据等各种数据都是需要持久化存储到磁盘,然后以”页”为单位进行读写。 相对于直接读写缓存,磁盘IO的成本相当高昂。 对于读…

    数据结构和算法 2023年6月8日
    072
  • AtCoder Beginner Contest 235

    AtCoder Beginner Contest 235 A – Rotate 思路分析: 因为他给的数是三位数,我们直接取出每一位,然后拼凑就可以了 代码如下: #i…

    数据结构和算法 2023年6月7日
    087
  • 从面试考察英语,想到的线性思维和立体思维

    请问,技术面试的时候需要考察英语吗? 大部分人如此回答: “代码写的好就行,考察英语干什么?” “又不是外企,都是中国人,要什么英语&#8221…

    数据结构和算法 2023年6月7日
    094
  • CF1614D-Divan and Kostomuksha

    首先我们有结论:本质相同的数一定被放在一起。 比方说我们现在令 (x) 成为 (a_1),那么我们希望让剩下的所有数 (y) 都变成 (\gcd(x,y)),这样子势必会产生很多相…

    数据结构和算法 2023年6月12日
    087
  • Java并发编程之美

    简介 《Java并发编程之美》分为三部分,第一部分为Java 并发编程基础篇,主要讲解Java 并发编程的基础知识、线程有关的知识和并发编程中的其他相关概念,这些知识在高级篇都会有…

    数据结构和算法 2023年6月16日
    091
  • 一一般筛法 + 埃式筛法 + 线性筛法

    我们如何计算从1~n一共有多少个质数呢,我们就要考虑一种筛法,用已知的数把确定的那些不会是质数的数全部筛掉! 我们先介绍第一种一般筛法: void get_primes2(){fo…

    数据结构和算法 2023年6月7日
    096
  • Java实现哈希表

    2.1、哈希冲突 冲突位置,把数据构建为链表结构。 装载因子=哈希表中的元素个数 / (散列表)哈希表的长度 装载因子越大,说明链表越长,性能就越低,那么哈希表就需要扩容,把数据迁…

    数据结构和算法 2023年6月16日
    070
  • Html飞机大战(十三): 暂停状态编辑

    好家伙,本篇介绍如何添加暂停状态 按照惯例我们依旧先分析思路 什么时候游戏应该暂停? 当我的鼠标不在游戏画面内了,我们就可以直接暂停了 在当我的鼠标回来以后,我们继续进行游戏 所以…

    数据结构和算法 2023年6月12日
    068
  • MOOC高级语言程序设计第八章课后作业

    题目描述 设计一个日期类(Date),用来实现日期的操作。包括一个空构造函数,三个成员函数,其余所需自行决定。用成员函数setDate()用来给Date类设置日期。用成员函数isL…

    数据结构和算法 2023年6月16日
    084
  • 排序算法二

    讲两种nlogn时间复杂度的排序算法,一个归并排序,一个快速排序。这两种算法都采用了分治的思想,将大问题转换为很多个小问题来处理,所以实现上一般采用递归的编程技巧。 归并排序的处理…

    数据结构和算法 2023年6月16日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球