由于最近空闲时间有在回头看《大话设计模式》,不妨说说今天早上睡觉醒来的一件小事。 ----题记
每天早上醒来,第一件事情,打开手机看时间,然后打开QQ、网易邮箱看有没有晚上给我发消息,突然间就开始思考为什么邮箱可以不受软件本身的限制而跨平台的发信呢?163可以发给QQ等,为什么这些及时通讯软件不可以呢?如果这样的话,作品展晚上我就可以用QQ去抢红包了,为什么还要再安装我不使用的微信呢?
带着这个问题我去洗脸、刷牙,隐约间感到大话中的适配器模式貌似可以解决这个问题哎~~~(此处纯属无厘头#¥@%%……¥#瞎想)
一、定义:
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
二、使用背景:
系统的数据和行为都正确,但接口不符时,那么该考虑使用该模式,目的是使得控制范围之外的一个原有对象与某个接口匹配。
三、自我理解:
“亡羊补牢”永远为时不晚,这个模式我个人的理解就是用来亡羊补牢时候使用的,软件设计过程中,接口应该一致,只有实在两个类之间需要建立关系时而接口又不相同的情况下才使用它,So,我觉得这个模式算是23个模式中最简单的一个模式,因为它仅仅用来修补,思想比较简单。
于是结合到如何用QQ去抢红包这件事情,我想如果利用这个模式就可以实现了。
As shown in this figure:
按照这个类图去实现代码:
QQ类:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 适配器 { class QQ { protected string ID; //qq用户的账号 int Money; int number=50; public QQ(string id) //构造函数 { this.ID = id; } public void SendMessage() { Console.WriteLine("发送QQ消息"); //发消息的方法,仅仅支持与QQ之间的消息发送 } public virtual void Grab_QQ_red_envelope() //抢QQ红包的方法 { Console.WriteLine("我的QQ红包金额为{0}", this.number); //每次抢钱,金额限制为50元。 } } }接下来是微信类:
namespace 适配器 { class WeChat { public string id; int number = 1000; int Money; //期间发送消息的代码省略 public void Get_WX_Red_Papper() //抢微信的红包 { this.Money = this.number; Console.WriteLine("我的微信红包金额为{0}",this.Money); //奖金限制为每人1000元。 } } }如何使得我用我的QQ就能抢到微信中的1000元红包呢?
于是有了Adapter适配器:
namespace 适配器 { class Adapter:QQ { protected string id; private WeChat wechat = new WeChat();//这两行的代码, public Adapter(string id):base(id)//我理解为该模式的“程序眼” { wechat.id=id; } public override void Grab_QQ_red_envelope() { wechat.Get_WX_Red_Papper(); //对QQ类的方法重写,实现“偷梁换柱,瞒天过海”的功效 } } }最后是客户端:
namespace 适配器 { class Program { static void Main(string[] args) { QQ zzh = new QQ("123"); //定义一个QQ用户张振华 QQ wzh = new Adapter("234"); //定义一个QQ用户王振华 zzh.Grab_QQ_red_envelope(); wzh.Grab_QQ_red_envelope(); Console.Read(); } } }最后的结果,QQ用户既可以抢QQ红包,也可以抢微信红包。
总结:
通过写这个小小的例子,对适配器模式有了自己的见解,能够用代码来解释它,让我认识到这个模式究竟该何时用、如何用,程序眼是什么。
其实这个模式总会给我一种三十六计中”偷梁换柱“、”瞒天过海“的feel,以后的学习我觉得该多一些和生活的结合,这样的认识才更深刻。
That is all.