江山新闻网

首页 > 正文

漫画:如何给女朋友解释什么是适配器模式?

www.gdzzdb.com2019-07-28

  R9BJ20sGJjrXCg

  本文经授权转载自漫话编程(ID:mhcoding)

  责编 | 伍杏玲

  周末窝在家里面打王者荣耀,女朋友在旁边玩我的电脑,我嫌她播放的综艺节目声音比较大,于是建议她戴耳机。

  RVyhiKZEZgLBFMRVyhiKsDmdxER5RVyhiL86xfBEyfRVyhiLNuUIacfRVyhiLlDIC5gCTRVyhiXH2SAN643RC6F7x6B7dmJLm

  适配器模式

  Adapter Pattern,通常被翻译成适配器模式,有时候也叫做包装模式(Wrapper Pattern),是GOF 23种设计模式之一。主要作用是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

  《Design Patterns: Elements of Reusable Object-Oriented Software》(《设计模式》),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为"Gang of Four),简称GOF。

  GOF中将适配器模式分为类适配器模式和对象适配器模式。

  对象适配器模式

  在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

  类适配器模式

  这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

  二者区别仅在于适配器角色对于被适配角色的适配是通过继承还是组合来实现的,由于Java中?恢С侄嗉坛校依嗍逝淦髂J接衅苹捣庾爸樱椅颐且蔡岢嘤米楹仙儆眉坛小K员疚闹饕樯芏韵笫逝淦鳌?

  RVyhiXX8RuHW03RVyhiXqHD4oNAKRVyhiYB74qqnPnRC6F8263HibLH0

  适配器模式用途

  我们生活中经常需要用到插口转换器,比如现在很多手机都只有一个插口,这个口可以直接用来充电和听音乐。但是前提是我们使用的充电器和耳机的插口要和这个设备适配的。

  目前市面上很多手机的插口都是Type-C或者Lightning型号:但是,我们常用的耳机型号却是2.5mm和3.5mm的圆形接口。

  所以,当我们想要把自己的3.5mm圆形接口的耳机插入Lightning或者Type-C接口的时候,就需要一个转换器。

  同理,在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足。如以下类似的场景:

  1、系统需要使用现有的类,而此类的接口不符合系统的需要。

  2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。

  3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

  适配器模式,就可以解决以上的问题。

  RVyhiYXAUENJ73RVyhijE4CdZ1FjRVyhijT7stR9I2RVyhijo8cqY1ysRC6F82ZBQQOfLo

  适配器模式实现方式

  下面我们就使用适配器模式,模拟一种场景:使用一个安卓的type-c充电器给只支持 Lightning接口的苹果手机充电(假设可以完美支持)。

  已知,我们有一个type-c充电器、一个Lightning插口的苹果手机。无论是Type-C还是Lightning,都是一种标准,在代码中,标准即接口。所以我们先定义两个接口:

  /**

  * Lightning充电接口

  */

  public interface LightningInterface{

  public void chargeWithLightning;

  }

  /**

  * TypeC充电接口

  */

  public interface TypeCInterface{

  public void chargeWithTypeC;

  }

  接下来定义我们的苹果手机,他只支持使用 Lightning插口充电:

  public class IphoneX{

  private LightningInterface lightningInterface;

  public IphoneX{

  }

  public IphoneX(LightningInterface lightningInterface){

  this.lightningInterface = lightningInterface;

  }

  public void charge{

  System.out.println("开始给我的IphoneX手机充电...");

  lightningInterface.chargeWithLightning;

  System.out.println("结束给我的IphoneX手机充电...");

  }

  //setter/getter

  }

  然后再来看看我们的安卓充电器应该如何定义:

  /**

  * 安卓设备的充电器

  */

  public class AndroidCharger implements TypeCInterface{

  

热门浏览
热门排行榜
热门标签
日期归档