适配其实在生活中的例子很多。一个变压器就是最好的例子。
我们不能要求供电局为了我们的随身听而把电压变成12V,只能使用一个变压器把220V的电转换成12V的。这就是个适配器的很好的

例子。新的需求就是我们要12V的电,而原来的电只能提供220V,那么我们就定义一个接口叫做"12V电源使用",然后定一个Adapter

变压器,里面接收(组合)了220V的电源,在里面经过一系列的动作以后,实现了"12V电源使用"这个接口,传出12V电源。

设计模式中的适配器模式可以分为对象适配器和类适配器

对象适配器中适配与被适配的对象是组合关系,符合面向对象设计原则:优先选择组合方案,而不是继承方案。

类的适配器中适配与被适配的对象是继承关系,适配器要继承被适配对象和新的接口。由于C#(vb.net)并不支持多继承,所以限制

了类适配器的使用,所以在dotnet中并不推荐使用这种适配方式。

当一个对象A不能满足新需求R时,就可以定义一个适配器Adaper,把A组合到新的Adaper中。在Adaper中使用A的功能和新功能以满

足新需求R。
这句话就说明了适配器模式。适配器就是Adaper,被适配的对象就是A,新需求R可以定义一个接口,并用适配器实现这个接口。

在软件设计过程中,也有很多不那么规范的Adapter模式,但是它们也是适配器的思想,也叫做适配器。
如果我们现在存在一个Case类,代表工作。现在有个新的需求,要求对Case根据一些条件进行排序。而Case类本身是没有排序功能的

,这么办呢? Aapter模式就有用了。在这种情况下,我们可以做个Adapter,它实现Icompareable接口。在使用时,直接为Case数

组调用Sort方法,并传入Case数组和刚才新建的adapter对象就可以了。但是这么实现呢?在适配器(CaseAdapter)里实现一个

Compare方法,传进去两个Case对象,根据Case的某个属性,返回一个数值。根据这个值就知道哪个该放在前面了。在这里,并没有

把被适配的对象Case放入Adapter中,而是直接通过参数传入。这并没有符合设计模式的结构,但是却使用了适配器模式的思想.调用代码如下:

Code
 1 Case[] cases = new Case[] { new Case(1), new Case(3), new Case(5), new Case(44), new Case(8), new Case(555), new Case(8) };
 2
 3            Console.WriteLine("before sort");
 4            for (int i = 0; i < cases.Length; i++)
 5            {
 6                Console.WriteLine(cases[i].ItemCount);
 7            }
 8
 9            Array.Sort(cases, new CaseCompareAdapter());
10            Console.WriteLine("after sort");
11            for (int i = 0; i < cases.Length; i++)
12            {
13                Console.WriteLine(cases[i].ItemCount);
14            }
15
16            Console.ReadLine();

那么,如果标准的适配器模式结构是怎么样的呢?
假设我们现在要为Case加上一个TellAlerm的方法,但是却不能去修改Case类,这时就可以使用Adapter了。
我们新建一个CaseAlermAdapterStandard类,然后在构造方法中初始化一个Case对象。然后定义一个方法叫做TellAlarm,返回一个字符串。定义一个ItemCount,返回构造函数中的Case的ItemCount。现在就可以调用了。

调用代码如下:

Code
1 //standard structure for adapter design pattern
2            CaseAlarmAdapterStandard cAdapter = new CaseAlarmAdapterStandard(6);
3            Console.WriteLine(cAdapter.ItemCount);
4            cAdapter.ItemCount = 788;
5            Console.WriteLine(cAdapter.ItemCount);
6            Console.WriteLine(cAdapter.TellAlarm("due to deadline!"));
7            Console.ReadLine();

完整的适配器代码:Adapter design pattern

我说完这些,自己却有个疑惑,所谓适配器,是不是就是被适配的对象的所有功能+新功能呢?还是说根据需要选择被适配对象的功能?我个人觉得可能应该是根据需要选择被适配对象的功能.因为有可能我这个适配器不需要那么多功能,只需要被适配对象的一部分功能+新接口定义的功能,就可以满足要求了.

欢迎大家拍砖,我是学习设计模式的新手,希望大家多多指教.

转载于:https://www.cnblogs.com/GodSpeed/archive/2008/08/26/1276756.html

白话设计模式--结构型模式之 适配器模式(Adapter)相关推荐

  1. 设计模式 - 结构型模式_适配器模式

    文章目录 结构型模式 概述 Case 场景模拟⼯程 Bad Impl Better Impl (适配器模式重构代码) MQ消息适配 接口适配 小结 结构型模式 结构型模式主要是解决如何将对象和类组装成 ...

  2. 设计模式GOF23之-------------------结构型模式(适配器模式、代理模式、桥接模式、装饰模式、组合模式、外观模式、享元模式)

    一 结构型模式 二 适配器模式 下面我将用代码模拟键盘usb接口和ps/2的转接器 的适配器过程: 首先定义客户需求: package GOF23;public interface Target {v ...

  3. JAVA设计模式--结构型模式

    2019独角兽企业重金招聘Python工程师标准>>> 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模 ...

  4. 5 结构型模式之 - 适配器模式

    5 结构型模式之 - 适配器模式 适配器模式的介绍:适配器模式在开发中使用率很高,适配器是将两个不兼容的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得它们能够协作起来.例如经常碰到两个不相 ...

  5. 设计模式-结构型模式篇

    设计模式 目录: 一.代理模式 二.适配器模式 三.装饰者模式 四.桥接模式 五.外观模式 六.组合模式 七.享元模式 注:学习视频:黑马程序员Java设计模式 结构型模式 结构性模式描述如何将类或对 ...

  6. 设计模式-结构型模式(下)

    转载自https://mp.weixin.qq.com/s/SB2OTKYIirE2jIonsQy1hQ 在上一篇文章 详解设计模式之结构型模式(上)中我们学习了三种结构型模式:适配器模式.桥接模式. ...

  7. 设计模式-结构型模式-装饰模式

    设计模式-结构型模式-装饰模式 栗子 以成绩单需要家长签字为要求. 成绩单类图 // 抽象成绩单 public abstract class SchoolReport{// 成绩单你的成绩情况publ ...

  8. Java设计模式学习总结(7)——结构型模式之适配器模式

    适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能.这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口 ...

  9. 设计模式之结构型模式:适配器模式、桥接模式、组合模式、装饰器模式、代理模式、

    文章目录 什么是结构型模式 适配模式 适配器的数据结构 适配器的实现 缺省适配器 适配器优缺点 适配器模式的使用环境 桥接模式 桥接模式数据结构 桥接模式的实现 桥接模式和适配器模式的联用 桥接模式的 ...

最新文章

  1. Relay IR表示
  2. jar docker镜像不能启线程_使用docker部署SpringCloud项目
  3. python使用字典格式化字符串-如何在python-3.x中使用字典格式化字符串?
  4. 【学习笔记】16、常用内置函数(Built-in Functions)
  5. QT绘制堆叠水平条形图
  6. kali 安装volatility_kali对Windows内存在线取证
  7. NoClassDefFoundError和ClassNotFoundException
  8. mysql数据库参数
  9. Servlet,HTTP,Ruquest,Response
  10. 云图说 | 快速创建一个kubernetes集群
  11. SQLite(3) Windows安装小结
  12. mysql登陆案例_Mysql用户登陆验证过程 案例
  13. Unirech-最新腾讯云国际版注册流程-无需绑定paypal
  14. android 仿微信头像裁剪,android 模仿微信头像裁剪
  15. 计算机组成原理 第四版 总线的主模块 总线的从模块,总线的基本概念
  16. 【AUTOSAR】:功能安全(HSM与HOST的配置)
  17. 最浅显易懂kerberos认证和黄金白银票据
  18. codevs 1218 疫情控制
  19. 使用docker搭建gitlab版本控制系统
  20. 实战 goproxy 为中国steam登录加速

热门文章

  1. hdu 1698 Just a Hook(线段树区间修改)
  2. 共享单车或开启了物联网的大门,新的变革即将开启
  3. 荷兰搞定原子级数据存储:1平方英寸500TB
  4. codis codis-ha主从切换后服务器标记为offline
  5. mysql Table 'performance_schema.session_variables' doesn't exist
  6. delphi webbrowser 经常使用的演示样本
  7. URL传递中文、Ajax传递中文,Java如何编码如何解决乱码
  8. protobuf android ndk,直接在Android NDK端使用tensorflow(不使用JAVA api)
  9. 实时音视频直播带货中影响用户体验的Bug根因
  10. 分布式资本合伙人孙铭:分布式存储是未来趋势,非短期炒作