设计模式相关文章

一、前言

公司茶水间不知道什么时候新增了一个友宝自动售货机,里面的饮料比外面的价格便宜很多(几乎是半价啦)。兴冲冲的去点击金罐多加宝,价格3.5元,付钱发现没有带钱包,幸好带了手机可以微信、支付宝、QQ支付好牛逼的自动售货机。

无图无真相,下面直接上支付时候的图

二、基本概念

适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

适配器模式包含四个角色:

目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

需要适配的类(Adaptee):需要适配的类或适配者类。

适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

客户类 (Client):客户端调用

书上对适配器模式讲了两种类型,类适配器模式和对象适配器模式。由于类适配器模式通过多重继承对一个接口与另一个接口进行匹配,而C#、java等语言都不支持多重继承,因而这里只是介绍对象适配器。

三、代码示例

基本代码示例

        /// <summary>/// 目标抽象类角色/// </summary>public class Target{public virtual void Request(){Console.WriteLine("This is a common request");}}/// <summary>/// 适配者类角色/// </summary>public class Adaptee{public void SpecificRequest(){Console.WriteLine("This is a special request.");}}/// <summary>/// 适配器角色/// </summary>public class Adapter : Target{// 建立一个私有的Adeptee对象private Adaptee adaptee = new Adaptee();/// <summary>/// 通过重写,表面上调用Request()方法,变成了实际调用SpecificRequest()/// </summary>public override void Request(){adaptee.SpecificRequest();}}static void Main(string[] args){// 对客户端来说,调用的就是Target的Request()Target target = new Adapter();target.Request();Console.ReadKey();}

输出结果:This is a special request.

自动售货机代码示例说明适配器模式:

       //目标抽象类角色:支付接口public interface IPay{void Pay();}//适配者角色:支付宝支付、财付通支付、微信支付、现金支付public class Alipay{public void Ali_Pay(){Console.WriteLine("支付宝支付");}}public class Tenpay{public void Ten_Pay(){Console.WriteLine("QQ支付");}}public class WeixinPay{public void Wenxin_Pay(){Console.WriteLine("微信支付");}}public class CashPay{public void Cash_Pay(){Console.WriteLine("现金支付");}}/// <summary>/// 适配器角色:适配支付宝支付/// </summary>public class AliAdapter : Alipay, IPay{public void Pay(){base.Ali_Pay();}}/// <summary>/// 适配器角色:适配财付通支付/// </summary>public class TenAdapter : Tenpay, IPay{public void Pay(){base.Ten_Pay();}}/// <summary>/// 适配器角色:适配微信支付/// </summary>public class WeixinAdapter : WeixinPay, IPay{public void Pay(){base.Wenxin_Pay();}}/// <summary>/// 适配器角色:适配现金支付/// </summary>public class CashAdapter : CashPay, IPay{public void Pay(){base.Cash_Pay();}}static void Main(string[] args){//// 对客户端来说,调用的就是Target的Request()//Target target = new Adapter();//target.Request();//支付宝支付IPay alipay = new AliAdapter();alipay.Pay();//现金支付IPay cashPay = new CashAdapter();cashPay.Pay();//财付通支付IPay tenpay = new TenAdapter();tenpay.Pay();//微信支付IPay weixinPay = new WeixinAdapter();weixinPay.Pay();Console.ReadKey();}

输入结果:

四、总结

优点:

将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,而无须修改原有代码。

增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性。

灵活性和扩展性都非常好,通过使用配置文件,可以很方便地更换适配器,也可以在不修改原有代码的基础上增加新的适配器类,完全符合“开闭原则”。

应用举例:

电脑适配器

ADO.NET中的DataAdapter

五、最后上个全图

代码下载:https://yunpan.cn/cYDYwAJM5KBCw (提取码:2656)

转载于:https://www.cnblogs.com/yinrq/p/5300820.html

公司新加了一台友宝自动售货机引发的思考-适配器模式相关推荐

  1. 公司新加了一台友宝自动售货机引发的思考-适配者模式

    一.前言 公司茶水间不知道什么时候新增了一个友宝自动售货机,里面的饮料比外面的价格便宜很多(几乎是半价啦).兴冲冲的去点击金罐多加宝,价格3.5元,付钱发现没有带钱包,幸好带了手机可以微信.支付宝.Q ...

  2. 学校的友宝自动售货机出故障 不知什么系统呵

    2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/leopardsaga/blog/88988

  3. 【声波传钱】支付宝新功能 “声波支付” 自动售货机已投入试运

    [声波传钱]支付宝新功能 "声波支付" 自动售货机已投入试运 AndyTom 11137 等级:博士生     上周末,北京地铁4号线两个站点灵境胡同及魏公村内的"声波支 ...

  4. 看我如何破解一台自动售货机

    毫无疑问,自动售货机是非常受欢迎的东西,我们总会从中购买获取一些小零食.早几年前,自动售货机只接受离线的硬币支付,之后,也慢慢采用了普及的NFC技术功能.如果我说起"COGES"售 ...

  5. plc是一台专用计算机对,PLC控制自动售货机设计 (2).doc

    . 页 自动售货机的PLC系统设计 摘要: 本文介绍了自动售货机的基本原理以及工作流程,然后以一次交易过程为例,把交易过程分为几个程序块,然后分别对程序块进行编程.具体说明了可编程序控制器在自动售货机 ...

  6. 600台自动售货机的管理系统是这样 | 新零售「良品铺子」

    良品铺子发力新零售,目前很多城市在线下良品铺子便利柜中都可以直接购买「良品铺子」的零食的产品.也许某天,你在楼下就能看到这个可爱的良品铺子了,再也不用担心双11你的零食还在路上的囧境,京品高科为良品铺 ...

  7. 随着无人新零售经济的崛起,商场、车站、大厦等各种场所都引入了无人饮品自动售货机,方便人们选购自己想要的饮品。购买者选择想要的饮品,通过投币或扫码的方式支付,支付成功后从出货口取出饮品。

    drink={'绿茶':2,'冰糖雪梨':2,'尖叫':4,'阿萨姆':4.5,} Cart=[] def Go_shooping():for key, values in drink.items() ...

  8. 一台自动售货机只接收 1 元硬币、1 元纸币以及 5 元纸币。如果买一 个笔记本需要 6 元,有多少种付款方式_______68__________。

    分析: 这里一看,理清题意,我们很快可以知道这道题用"可重组合"来做.不过这里要考虑投放硬币的顺序问题(容易在这里出错).比如先投放一个一元硬币,再投放一个一元纸币.两个交换顺序, ...

  9. 友宝:掘金生活物联网

    自友宝和微信支付合作的"互联网自助售货机"亮相2013年中国互联网大会以来,她一下就火了. 但为什么火,大家并没有搞清楚.何玺认为,友宝做的是生活物联网. 何为生活物联网?何玺认为 ...

最新文章

  1. SecureCRT从Windows中上传文件lrzsz工具
  2. Java编程思想 第十五章:泛型
  3. 一个最简单的UDP通信
  4. VMware虚拟机扩展Ubuntu系统磁盘空间
  5. ubuntu 16.04下git的安装与使用
  6. 小马儿随笔(三)——小标签 大学问
  7. 地推HTTP3和QUIC
  8. python的自定义异常类,带参Exception,多个except,断言语句,断点,try...except,try...except...else,try...except...finally处理
  9. 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题一
  10. ARM环境中的c语言socket进程通信-转
  11. 【STM32H7的DSP教程】第27章 FFT的示波器应用
  12. 黑色的cms商城网站后台管理模板——后台
  13. TTML(IMSC)字幕
  14. 经典数字电路 设计案例
  15. 实例学习之仿点点博客
  16. ubuntu22.04 耳机没声音 [已解决]
  17. 5.4 创建 WBS
  18. Python|用turtle画笔画爱心
  19. 跳动公差与其他几何公差(一)
  20. SuperMap webgl 中使用的gltf模型制作方法

热门文章

  1. word转freemarker和修改的步骤
  2. 新技术焦虑症?来这里拿药 ~~
  3. sencha touch 相机,相册调用
  4. kali2019安装netspeed教程
  5. php vox转码,Audio Track Convert Tool(音轨转码工具)
  6. 第18届中国智能家居主题沙龙在北京成功举办
  7. OpenCV更改图片颜色
  8. ②五元物联网芯片点亮led 庆科EMW3060 , 运行alios- blink程序
  9. 上海庆科EMW3162 AT指令固件 实现串口透传
  10. 交叉验证中cv=? 与 cv=KFold(n_splits=?)的区别