公司新加了一台友宝自动售货机引发的思考-适配器模式
设计模式相关文章
一、前言
公司茶水间不知道什么时候新增了一个友宝自动售货机,里面的饮料比外面的价格便宜很多(几乎是半价啦)。兴冲冲的去点击金罐多加宝,价格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
公司新加了一台友宝自动售货机引发的思考-适配器模式相关推荐
- 公司新加了一台友宝自动售货机引发的思考-适配者模式
一.前言 公司茶水间不知道什么时候新增了一个友宝自动售货机,里面的饮料比外面的价格便宜很多(几乎是半价啦).兴冲冲的去点击金罐多加宝,价格3.5元,付钱发现没有带钱包,幸好带了手机可以微信.支付宝.Q ...
- 学校的友宝自动售货机出故障 不知什么系统呵
2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/leopardsaga/blog/88988
- 【声波传钱】支付宝新功能 “声波支付” 自动售货机已投入试运
[声波传钱]支付宝新功能 "声波支付" 自动售货机已投入试运 AndyTom 11137 等级:博士生 上周末,北京地铁4号线两个站点灵境胡同及魏公村内的"声波支 ...
- 看我如何破解一台自动售货机
毫无疑问,自动售货机是非常受欢迎的东西,我们总会从中购买获取一些小零食.早几年前,自动售货机只接受离线的硬币支付,之后,也慢慢采用了普及的NFC技术功能.如果我说起"COGES"售 ...
- plc是一台专用计算机对,PLC控制自动售货机设计 (2).doc
. 页 自动售货机的PLC系统设计 摘要: 本文介绍了自动售货机的基本原理以及工作流程,然后以一次交易过程为例,把交易过程分为几个程序块,然后分别对程序块进行编程.具体说明了可编程序控制器在自动售货机 ...
- 600台自动售货机的管理系统是这样 | 新零售「良品铺子」
良品铺子发力新零售,目前很多城市在线下良品铺子便利柜中都可以直接购买「良品铺子」的零食的产品.也许某天,你在楼下就能看到这个可爱的良品铺子了,再也不用担心双11你的零食还在路上的囧境,京品高科为良品铺 ...
- 随着无人新零售经济的崛起,商场、车站、大厦等各种场所都引入了无人饮品自动售货机,方便人们选购自己想要的饮品。购买者选择想要的饮品,通过投币或扫码的方式支付,支付成功后从出货口取出饮品。
drink={'绿茶':2,'冰糖雪梨':2,'尖叫':4,'阿萨姆':4.5,} Cart=[] def Go_shooping():for key, values in drink.items() ...
- 一台自动售货机只接收 1 元硬币、1 元纸币以及 5 元纸币。如果买一 个笔记本需要 6 元,有多少种付款方式_______68__________。
分析: 这里一看,理清题意,我们很快可以知道这道题用"可重组合"来做.不过这里要考虑投放硬币的顺序问题(容易在这里出错).比如先投放一个一元硬币,再投放一个一元纸币.两个交换顺序, ...
- 友宝:掘金生活物联网
自友宝和微信支付合作的"互联网自助售货机"亮相2013年中国互联网大会以来,她一下就火了. 但为什么火,大家并没有搞清楚.何玺认为,友宝做的是生活物联网. 何为生活物联网?何玺认为 ...
最新文章
- SecureCRT从Windows中上传文件lrzsz工具
- Java编程思想 第十五章:泛型
- 一个最简单的UDP通信
- VMware虚拟机扩展Ubuntu系统磁盘空间
- ubuntu 16.04下git的安装与使用
- 小马儿随笔(三)——小标签 大学问
- 地推HTTP3和QUIC
- python的自定义异常类,带参Exception,多个except,断言语句,断点,try...except,try...except...else,try...except...finally处理
- 企业邮件系统搭建-关于不能往yahoo,sina,hotmail地址发邮件的问题一
- ARM环境中的c语言socket进程通信-转
- 【STM32H7的DSP教程】第27章 FFT的示波器应用
- 黑色的cms商城网站后台管理模板——后台
- TTML(IMSC)字幕
- 经典数字电路 设计案例
- 实例学习之仿点点博客
- ubuntu22.04 耳机没声音 [已解决]
- 5.4 创建 WBS
- Python|用turtle画笔画爱心
- 跳动公差与其他几何公差(一)
- SuperMap webgl 中使用的gltf模型制作方法
热门文章
- word转freemarker和修改的步骤
- 新技术焦虑症?来这里拿药 ~~
- sencha touch 相机,相册调用
- kali2019安装netspeed教程
- php vox转码,Audio Track Convert Tool(音轨转码工具)
- 第18届中国智能家居主题沙龙在北京成功举办
- OpenCV更改图片颜色
- ②五元物联网芯片点亮led 庆科EMW3060 , 运行alios- blink程序
- 上海庆科EMW3162 AT指令固件 实现串口透传
- 交叉验证中cv=? 与 cv=KFold(n_splits=?)的区别