前言

适配器,属于类结构型模式。《设计模式 - 可复用的面向对象软件》一书中将之描述为“ 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 ”。

在日常生活中,我们经常遇到“不兼容”的情况。比如充电器的插头与插座不兼容,手机的接口与电脑的接口兼容等等。遇到这些问题,一般我们的解决办法是在两个不兼容的物件之间增加一个转换器,达到(间接)兼容的目的。而在软件开发的过程中,我们使两个接口兼容的方式就是适配器模式。

结构

适配器模式分为类适配对象适配两种,具体结构如下:

类适配:

对象适配:

在适配器模式中,需要角色如下:

  • Target(目标抽象): 调用者直接使用的抽象;
  • Adapter(适配器): 目标抽象的子类或实现类,对Target和Adaptee进行适配;
  • Adaptee(被适配的类): 一般情况下是一个已存在的需要与之兼容的类;

示例

考虑一个文本编辑器,它的首要任务是对各类文件进行解析,每种文件的解析方法由接口IFileParseService的各个实现类实现,并且已经在TxtParse类中实现了对.txt文件的解析。在对这个文本编辑器进行扩展来支持.xm和.sqll文件时引用了包含解析方法的第三方库FileParseTool。接下来看看如何使用类适配和对象适配使接口IFileParseService与FileParseTool兼容。

  • 类适配(XmlFileParse)

public interface IFileParseTool
{string FileParsing();
}public class XmlFileParseTool : IFileParseTool
{public string FileParsing(){return "Xml文件解析中...";}
}public interface IFileParseService
{string Parsing();
}public class XmlFileParse : XmlFileParseTool, IFileParseService
{public string Parsing(){return base.FileParsing();}
}static void Main(string[] args)
{IFileParseService xmlParseService = new XmlFileParse();Console.WriteLine(xmlParseService.Parsing());Console.ReadKey();
}

由于每个类只能继承一个类,所以当我们需要同时适配多个类时,类适配并不能满足我们的需求。

  • 对象适配(SqlFileParse)

public interface IFileParseTool
{string FileParsing();
}public class SqlFileParseTool : IFileParseTool
{public string FileParsing(){return "Sql文件解析中...";}
}public interface IFileParseService
{string Parsing();
}public class SqlFileParse : IFileParseService
{public SqlFileParse(IFileParseTool parseTool){this._parseTool = parseTool;}private IFileParseTool _parseTool = null;public string Parsing(){return this._parseTool.FileParsing();}
}static void Main(string[] args)
{IFileParseTool sqlParseTool = new SqlFileParseTool();IFileParseService sqlParseService = new SqlFileParse(sqlParseTool);Console.WriteLine(sqlParseService.Parsing());Console.ReadKey();
}

对象适配的方式使得适配器更加灵活,并且可同时适配多个类。另外,对象适配还可通过同一个适配器既可以使接口IFileParseService适配IFileParseTool的同时使IFileParseTool适配接口IFileParseService,达到双向适配的效果。如下:

  • 双向适配(FileParse)

public interface IFileParseTool
{string FileParsing();
}public class XmlFileParseTool : IFileParseTool
{public string FileParsing(){return "Xml文件解析中...";}
}public interface IFileParseService
{string Parsing();
}public class TxtFileParse : IFileParseService
{public string Parsing(){return "Txt文件解析中...";}
}public class FileParse : IFileParseService, IFileParseTool
{private IFileParseService _parseService = null;private IFileParseTool _parseTool = null;public FileParse(IFileParseService parseService){this._parseService = parseService;}public FileParse(IFileParseTool parseTool){this._parseTool = parseTool;}/// <summary>/// 接口IFileParseTool的实现/// </summary>/// <returns></returns>public string FileParsing(){return this._parseService.Parsing();}/// <summary>/// 接口IFileParseService的实现/// </summary>/// <returns></returns>public string Parsing(){return this._parseTool.FileParsing();}
}static void Main(string[] args)
{//接口IFileParseService兼容IFileParseToolIFileParseService parseService = new FileParse(new XmlFileParseTool());Console.WriteLine(parseService.Parsing());//接口IFileParseTool兼容IFileParseServiceIFileParseTool parseTool = new FileParse(new TxtFileParse());Console.WriteLine(parseTool.FileParsing());Console.ReadKey();
}
  • 接口适配器

接口适配器,又称默认适配器。一般在一个类实现一个接口又不想或不需要实现接口中的所有方法时去创建一个实现这个接口的抽象类,并为该接口中的每个方法提供一个默认的实现(比如控方法),再由类去继承这个抽象类。这样就可以在类中由选择性的重写方法。

总结

适配器模式主要的目的是用来使不兼容的接口能够在一起工作,提高了类的复用,以及程序的灵活性。但过多的使用适配器会让程序的调用显得比较混乱。更多情况下,适配器模式在扩展现有程序下使用。

以上,就是我对适配器模式的理解,希望对你有所帮助。

示例源码:https://gitee.com/wxingChen/DesignPatternsPractice

系列汇总:https://www.cnblogs.com/wxingchen/p/10031592.html

本文著作权归本人所有,如需转载请标明本文链接(https://www.cnblogs.com/wxingchen/p/10078587.html)

转载于:https://www.cnblogs.com/wxingchen/p/10078587.html

二十三种设计模式[6] - 适配器模式(Adapter Pattern)相关推荐

  1. Java的二十三种设计模式(适配器模式(Adapter)、对象的适配器模式)

    适配器模式(Adapter) 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题.主要分为三类:类的适配器模式.对象的适配器模式.接口的适配器模式 ...

  2. 深入理解常见的二十三种设计模式

    深入理解常见的二十三种设计模式 文章目录 深入理解常见的二十三种设计模式 一.设计模式的分类 1.1 创建型(五种) 1.2 结构型(七种) 1.3 行为型(十一种) 二.创建型 2.1 单例模式 2 ...

  3. 二十三种设计模式-六大原则

    二十三种设计模式 一.创建型: 单例模式.工厂模式.抽象工厂模式.原型模式.建造者模式: 二.结构型: 代理模式,装饰器模式.适配器模式.外观模式.组合模式.享元模式.桥梁模式: 三.行为型: 策略模 ...

  4. Java实现二十三种设计模式(五)—— 十一种行为型模式 (中)——解释器模式、迭代器模式、中介者模式、备忘录模式

    Java实现二十三种设计模式(五)-- 十一种行为型模式 (中)--解释器模式.迭代器模式.中介者模式.备忘录模式 一.解释器模式 我国 IT 界历来有一个汉语编程梦,虽然各方对于汉语编程争论不休,甚 ...

  5. 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabcd 介绍 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本 ...

  6. Java二十三种设计模式 之代理(proxy)

    Java二十三种设计模式 之代理(proxy) 今天我们学习一下静态代理和动态代理 我们来看代码(写一个坦克运行了多少时间): 第一种方法: public calss Tank implements ...

  7. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  8. 二十三种设计模式之原型模式

    今天继续探讨GOF二十三种设计模式的原型模式,原型模式也是属于创建型模式的一种 原型模式通俗的讲就是对象复制的过程,即通过一个原型对象,我可以得到一个该对象的克隆. 下面来看下原型模式的第一种写法-- ...

  9. 第二部分:二十三种设计模式解读——什么是工厂方法模式

    二十三种设计模式解读--什么是工厂方法模式 author:陈镇坤27 日期:2022年2月10日 修改日期:2022年6月23日 文章目录 二十三种设计模式解读--什么是工厂方法模式 一.工厂方法模式 ...

最新文章

  1. 自然语言处理:网购商品评论情感判定
  2. python脚本——图片重命名、图片合成视频、faster-rcnn画P-R曲线
  3. Ubuntu16.04运行.run文件
  4. Facebook如何预测广告点击:剖析经典论文GBDT+LR
  5. vue模拟加载更多功能(数据追加)
  6. Idea和redis的坑
  7. 单进程select版-TCP服务器(python 版)
  8. VUE中axios 报错 TypeError: Cannot set property ‘type‘ of undefined,
  9. linux grub内核选择,UBUNTU GRUB没有内核选项,怎么回事啊?
  10. dotnet core在Linux下运行的步骤
  11. org.apache.commons.fileupload.DiskFileUpload
  12. MapGuide open source开发心得一:简介
  13. 手把手教你Photoshop中的图层混合模式(一)
  14. 如何在微信开发工具装插件教程
  15. 雨林木风发布 Windows一键还原 2011 v1.5.5.6
  16. 路由器分出ITV与网络信号资料
  17. 全球及中国虚拟现实产业营收规模预测及投资策略建议报告2021-2027年
  18. Appium自动化——day1
  19. 股票涨停放量是什么意思?股票涨停尾盘打开是什么意思?
  20. 如何下载唐山市卫星地图高清版大图

热门文章

  1. arcgisengine计算线要素总长度_掌握K线并不难!新手请牢记K线四要素:开盘价、收盘价、最低价、最高价,看不懂别炒股...
  2. python函数的特性_Python学习(007)-函数的特性
  3. centos php 开启mysql扩展_CentOS 7下部署php7.1和开启MySQL扩展的方法教程
  4. 我的世界服务器自定义代码,《我的世界》服务器指令代码秘籍大全
  5. ctfshow-WEB-web6
  6. Python嗅探socket
  7. 用友U8常见问题之最大单据号修复语句
  8. Atlas读写分离Mysql集群的搭建
  9. 修路方案(次小生成树)
  10. HDOJ 1004:统计气球数