Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >适配器模式

适配器模式

原创
作者头像
WindRunnerMax
修改于 2020-10-27 06:22:42
修改于 2020-10-27 06:22:42
6820
举报
文章被收录于专栏:Czy‘s BlogCzy‘s Blog

适配器模式

适配器模式Adapter Pattern又称包装器模式Wrapper Pattern是作为两个接口或对象之间的桥梁,这种类型的设计模式属于结构型模式,它结合了两个独立接口或对象的功能,这种模式负责加入独立的或不兼容的接口与对象,在Js中通常可以使用适配器模式进行框架的适配、参数的适配以及数据的适配。

描述

软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式,通常情况下,客户端可以通过目标类的接口访问它所提供的服务。有时现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用,如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类指的就是适配器Adapter,它所包装的对象就是适配者Adaptee,即被适配的类。适配器提供客户类需要的接口,适配器的实现就是把客户类的请求转化为对适配者的相应接口的调用。也就是说,当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。因此适配器可以使由于接口不兼容而不能交互的类可以一起工作。

模式结构

  • Target: 目标类。
  • Adapter: 适配器类。
  • Adaptee: 适配者类。
  • Client: 客户类。

优点

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。
  • 增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。
  • 灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合开闭原则。
  • 在类适配器模式中一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说同一个适配器可以把适配者类和它的子类都适配到目标接口。
  • 在对象适配器模式中由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

缺点

  • 对于JavaC#等不支持多重继承的语言,类适配器模式一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。
  • 与类适配器模式相比,对象适配器模式要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。

适用环境

  • 使用一个已经存在的对象,但其方法或属性接口不符合你的要求。
  • 要想创建一个可复用的对象,该对象可以与其它不相关的对象或不可见对象(即接口方法或属性不兼容的对象)协同工作。
  • 想使用已经存在的对象,但是不能对每一个都进行原型继承以匹配它的接口,对象适配器可以适配它的父对象接口方法或属性。

对比

  • 适配器和桥接模式虽然类似,但桥接的出发点不同,桥接的目的是将接口部分和实现部分分离,从而对他们可以更为容易也相对独立的加以改变。而适配器则意味着改变一个已有对象的接口。
  • 装饰者模式增强了其它对象的功能而同时又不改变它的接口,因此它对应程序的透明性比适配器要好,其结果是装饰者支持递归组合,而纯粹使用适配器则是不可能的。
  • 代理模式在不改变它的接口的条件下,为另外一个对象定义了一个代理。

实现

代码语言:txt
AI代码解释
复制
class Target {
    say(){
        console.log("Target say");
    }
}

class Adaptee {
    say(){
        console.log("Adaptee say");
    }
}

class Adapter extends Target {
    constructor(adaptee) {
        super();
        this.adaptee = adaptee;
    }
    say() {
        // Use this.adaptee to implement the method in target
        console.log("Adaptee to Target say")
    }
}

(function(){
    var adaptee = new Adaptee();
    var adapter=new Adapter(adaptee);
    adapter.say(); // Adaptee to Target say
})();

/**
    一个例子
    原有一个非常类似jQuery的轻量框架要转用jQuery,需要适配接口,假如只有通过id取得元素的方法需要适配
    class Target { // 这就是原轻量框架
        getElement(id){
            return document.getElementById(id);
        }
    }

    var adaptee = $; // 此处Adaptee即jQuery

    class Adapter extends Target {
        constructor(adaptee) {
            super();
            this.adaptee = adaptee;
        }
        getElement(id) {
            return this.adaptee(`#${id}`);
        }
    }
    
    // 之前是使用 Target 对象的实例 target
    // 适配之后使用 Adapter 对象的实例 adapter 并可以将 target 指向 adapter

 */

每日一题

代码语言:txt
AI代码解释
复制
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:txt
AI代码解释
复制
https://segmentfault.com/a/1190000012436538
https://www.runoob.com/design-pattern/adapter-pattern.html
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式(六):适配器模式
设计模式(六):适配器模式
Java架构师必看
2021/05/14
2680
面试官:啥是适配器模式?
某公司欲开发一款儿童玩具汽车,为了更好地吸引小朋友的注意力,该玩具汽车在移动过程中伴随着灯光闪烁和声音提示。在该公司以往的产品中已经实现了控制灯光闪烁(例如警灯闪烁)和声音提示(例如警笛音效)的程序,为了重用先前的代码并且使得汽车控制软件具有更好的灵活性和扩展性,现使用适配器模式设计该玩具汽车控制软件。
千羽
2021/12/29
6630
面试官:啥是适配器模式?
Java面向对象设计之适配器模式
如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。
Abalone
2022/07/14
3250
Java面向对象设计之适配器模式
【Java设计模式系列】适配器模式及适用场景详解
一般客户端通过目标类的接口访问它所提供的服务。 有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。
JavaEdge
2021/10/18
1.4K0
一看就懂的适配器设计模式
一般客户端通过目标类的接口访问它所提供的服务。有时,现有类可以满足客户端类的需要,但所提供接口不一定是客户端所期望的,可能因为现有类中方法名与目标类中定义的方法名不一致。
JavaEdge
2022/05/29
4530
一看就懂的适配器设计模式
设计模式~适配器模式
适配器模式(Adapter Pattern)把一个类的接口变换成客户端期待的另一种接口,从而是原本因接口不匹配而无法一起工作的两个类能够一起工作。
Vincent-yuan
2020/08/17
5130
适配器模式
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。——《设计模式:可复用面向对象软件的基础》
mingmingcome
2021/11/29
6220
适配器模式
【地铁上的设计模式】--结构型模式:适配器模式
结构型模式是一种设计模式,它描述了如何将类或对象结合在一起形成更大的结构,以提供新的功能或实现更复杂的行为。结构型模式包括以下几种:
喵叔
2023/05/03
2570
适配器模式1 动机2 模式定义3 模式结构4 时序图5 代码分析8 优点9 缺点10 适用环境11 模式应用12 模式扩展13 总结
1 动机 在软件开发中采用类似于电源适配器的设计和编码技巧 通常情况下,客户端可以通过目标类的接口访问它所提供的服务 有时,现有的类可以满足客户类的功能需要,但是它所提供的接口不一定是客户类所期望的,这可能是因为现有类中方法名与目标类中定义的方法名不一致等原因所导致的。 在这种情况下,现有的接口需要转化为客户类期望的接口,这样保证了对现有类的重用。 如果不进行这样的转化,客户类就不能利用现有类所提供的功能,适配器模式可以完成这样的转化。 在适配器模式中可以定义一个包装类,包装不兼容接口的对象,这个包装类
JavaEdge
2018/06/07
5260
Carson带你学设计模式:适配器模式(Adapter Pattern)
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
Carson.Ho
2022/03/25
2380
Carson带你学设计模式:适配器模式(Adapter Pattern)
Java设计模式之(八)——适配器模式
适配器模式(Adapter Pattern):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
IT可乐
2021/11/29
1.5K0
Java设计模式之(八)——适配器模式
一文搞懂设计模式—适配器模式
适配器模式(Adapter Pattern)属于结构型模式,用于将一个类的接口转换成客户端所期望的另一个接口。它允许不兼容的类之间进行合作,使得原本因接口不匹配而无法工作的类能够协同工作。
BookSea
2024/02/29
3150
一文搞懂设计模式—适配器模式
适配器模式(Adapter Pattern)- 最易懂的设计模式解析
把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法一起工作的两个类能够在一起工作。
Carson.Ho
2019/02/22
3.1K0
【设计模式 13】适配器模式
适配器模式包括类适配器和对象适配器两种,类适配器是适配器类同时实现目标抽象类和适配者类,这样需要编程语言支持多继承。
JuneBao
2022/10/26
1840
【设计模式 13】适配器模式
设计模式-适配器模式
目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
用户9322266
2022/10/09
2670
设计模式----适配器模式
适配器模式: 将一个类的接口,转化成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。 适配器模式的结构: 适配器模式一般有三个部分:目标类/接口、被适配的对象、适配器类。 目标类/接口:我们想要使用的接口。 被适配的对象:已经存在的对象。这个对象和目标接口不兼容,但我们想能够想调用目标接口那样调用这个对象。 适配器类:实现该类,来让原本接口不相容的类可以兼容。它要继承/实现目标类/接口,并且应该持有一个被适配对象的句柄。 示例代码: 目标接口: public interface Target
SuperHeroes
2018/05/30
4450
设计模式实战-适配器模式,承上启下
适配器,其实很好理解,生活中也随处可见,比如电源适配器、usb 适配器等等,那么适配器模式,也被称为Wrapper 模式。
架构师修炼
2020/07/20
5160
设计模式实战-适配器模式,承上启下
适配器模式
适配器模式是一种结构型设计模式,通过将一个类的接口转换为客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。适配器模式又称“包装器(Wrapper)”。
码事漫谈
2024/12/20
1910
适配器模式
适配器模式
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
许喜朝
2022/05/05
4030
设计模式---适配器模式
1、不同国家的插座是有区别的,如果我们去国外旅游,需要带上国外的插头转换器,来能兼容国外的插座;
大忽悠爱学习
2021/11/15
7810
相关推荐
设计模式(六):适配器模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档