如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)

如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)


概念相关

定义

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而

使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

简单点说

两个彼此间没有太大关联的类,想进行交互完成某些事情,如果

直接去修改各自的接口,就显得有些繁琐了,可以加个中间类

用它来协调两类之间的关系,完成相关业务。这种玩法就叫适配器模式!

两种适配器模式

根据适配器类与适配者类的关系不同,适配器模式可分为 类适配器

对象适配器两种,尽管都是三个角色,但还是有些差别的!

另外,类适配器的适配器和适配者是 继承 关系,而对象适

配器则是 引用 关系。

类适配器的三个角色

  • 目标接口(Target):客户所期待的接口,目标是接口
  • 需要适配的类(Adaptee):需要适配的类或适配者类;
  • 适配器(Adapter):实现了抽象目标类接口Target,并继承了适配者类Adaptee

对象适配器的三个角色

  • 目标接口(Target):客户所期待的接口,可以是具体的或抽象的类,也可以是接口
  • 需要适配的类(Adaptee):需要适配的类或适配者类;
  • 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口;

UML类图


举个最简单栗子

想了很久没想到什么好玩的例子,就写个最简单的英语翻译中文的例子

了解这个模式的玩法,后面有好的例子再换。



对象适配器的写法(用得较多)

说中文的接口:

说英语的人:

适配翻译器:

英语翻译成中文:

翻译后:

好的,非常简单,在适配类中传入需要转换的对象,完成转换而已。



类适配模式写法

翻译过程:

翻译结果:



两种玩法对比

对象适配器支持传入一个被适配器对象,因此可以做到对多种被适

配接口进行适配。而类适配器直接继承,无法动态修改,所以一般情况

下对象适配器使用得更多!(Java不支持多重继承!!!)


缺省适配器模式

当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类

实现该接口,并为接口中每个方法提供一个默认实现(空方法),

那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,

它适用于不想使用一个接口中的所有方法的情况,又称为单接口适配器模式。

简单点说就是:不想实现接口里的所有方法,写个基类去继承这个

接口,然后重写所有方法,子类再去继承这个基类,按需重写!

比如上面的例子,中文也有很多种类型啊,普通话,广东话,上海话:

我们现在只需要转换成普通话:

写个父类适配器:

写个普通话转换用的适配器:

开始翻译:

翻译结果:


小结



优点

  • 将目标类和适配者类解耦,通过引入一个适配器类来重用现有的

    适配者类,无须修改原有结构。

  • 增加了类的透明性和复用性,将具体的业务实现过程封装在适配

    者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,

    同一个适配者类可以在多个不同的系统中复用。

  • 灵活性和扩展性都非常好,可以很方便地更换适配器。
  • 一个对象适配器可以把多个不同的适配者适配到同一个目标。


缺点

  • 类适配器模式对于不支持多重类继承的语言,一次最多只能适配

    一个适配者类,不能同时适配多个适配者。

  • 适配者类不能为最终类,如在Java中不能为final类。
  • 在Java中,类适配器模式中的目标抽象类只能为接口,不能为类,

    其使用有一定的局限性。

  • 对象适配器要在适配器中置换适配者类的某些方法比较麻烦。

摘自工匠若水的——设计模式(结构型)之适配器模式(Adapter Pattern)



本节代码

https://github.com/coder-pig/DesignPatternsExample/tree/master/6.Adapter%20Pattern


时间: 2024-08-07 16:42:18

如何让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)的相关文章

设计模式之适配器模式(Adapter Pattern)

适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 1. 解决的问题 即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 模式中的角色 2.1 目标接口(Target):客户所期待的接口.目标可以是具体的或抽象的类,也可以是接口. 2.2 需要适配的类(Adaptee):需要适配的类或适配者类. 2.3 适配器(Adapter):通过包装一个需要适配的对象,把

Java设计模式之适配器模式(Adapter Pattern)

Adapter Pattern的作用是在不改变功能的前提下转换接口.Adapter分为两类,一类是Object Adapter, 另一类是Class Adapter.由于Class Adapter的实现需要用到多继承,而Java不支持多继承,所以这里只关注Object Adapter. 在JDK1.5之前是没有 java.util.Iterator 接口的,java.util.Enumeration 接口起着 Iterator 的作用.那么如果我们需要维护一些年代比较久远的代码,可能就会面临着没

二十四种设计模式:适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 示例有一个Message实体类,某个类对它的操作有Insert()和Get()方法.现在需要把这个类转到另一个接口,分别对应Add()和Select()方法. MessageModel using System; using System.Collections.Generic; using System.Text; name

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 详解

适配器模式(adapter pattern) 枚举器和迭代器 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本的枚举器(Enumeration)和现在的迭代器(Iterator) 可以使用适配器(adapter)进行转换. 适配器(adapter)代码: /** *

如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往文中插入几个表情的趋势了, 但是你真的插的姿势对了吗?这种事情不是随便插的,来来来,给你 见识下如何在适当的场景插入适当的表情以让读者感觉到易可赛艇, 本文以讲故事插表情为主,讲述桥接模式为辅,多图预警, 简书上排版可能有些问题,最佳排版可见: https://www.zybuluo.com/coder-pig/note

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)

如何让孩子爱上设计模式 --14.策略模式(Strategy Pattern) 描述性文字 本节讲解的是行为型设计模式中的第一个模式: 策略模式, 这个模式非常简单,也很好理解. 定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换, 让算法独立于使用它的客户而变化. 一般用来替换if-else,个人感觉是面向过程与面向对象思想的 过渡,这里举个简易计算器的栗子,帮助理解~ 普通的if-else/switch计算器 普通的面向过程if-else简易计算器代码如下: 运行结果如下: 这里我

设计模式之适配器模式(Adapter)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter pattern): http://blog.csdn.net/caroline_wendy/article/category/2281679 Java早期版本号的枚举器(Enumeration)和如今的迭代器(Iterator) 能够使用适配器(adapter)进行转换. 适配器(adapter)代码: /**

适配器模式--Adapter Pattern

模拟场景:很多人都喜欢看NBA吧,姚明进驻NBA,打开了中国的市场.虽然后面姚明在NBA打得还不错,但是在刚进入NBA篮坛的时候,并不是那么顺利的.语言交流就是一个最大的问题.刚开始打球期间,教练及队员的战术部署姚明都无法理解,所以他需要这么一个翻译者,将教练及队员的意思转达给姚明,这样才可以进行合作. 现在进行场景的模拟,先不考虑那么多.假如姚明一开始进入NBA的时候就已经会英语,可以进行交流了.那么这个时候教练就可以进行战术的部署了. 转换成类,所有的队员都要服从教练的战术要求,假设现在教练