.NET适配器模式简介(云服务器、云主机、高防IP、高防服务器、香港服务器、美国服务器,开发技术)

时间:2024-05-08 16:56:15 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

适配器模式简介:

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式结构图:

.NET适配器模式简介

引入实例进行说明:

以日志记录程序为Demo说明,在任何一套软件中都会有对应的日志管理模块,假如如果我们在开发软件中的日记记录采用第三方的日志组件进行日志记录,它采用的是Log.Write("写日志");的方式我们的程序在开发中,大量实例化日记记录对象,采用的Log.Write()方式进行日志记录,但是现在第三方的日志组件现在不免费了,需要收费了,于是我们打算使用一种新的日志管理模块,只不过它提供给我们的API接口是采用Log.WriteLog("新的写日志的方式");进行日志记录。这个时候问题就出现了,如何应对这种迁移的变化

类适配器模式

1.原来日志的接口,采用的是Write(“写日志”);方法

///<summary>///原来的日志记录接口///</summary>publicinterfaceILogTarget{///<summary>///原来的写日志方法///</summary>voidWrite(stringinfo);}

2.然而现在的写日志的接口,采用的是WriteLog("写日志");里面实现了写日志的新的方式:将日志写到文件中,数据库中

///<summary>///抽象写日志类///</summary>publicabstractclassLogAdaptee{///<summary>///写日志///</summary>publicabstractvoidWriteLog(stringinfo);}
///<summary>///写文件日志记录///</summary>publicclassFileLog:LogAdaptee{///<summary>///写日志到文件中///</summary>publicoverridevoidWriteLog(stringinfo){Console.WriteLine("记录到文本文件:"+info);}}
///<summary>///往数据库中写日志///</summary>publicclassDatabaseLog:LogAdaptee{///<summary>///重写写日志方法///</summary>publicoverridevoidWriteLog(stringinfo){Console.WriteLine("记录到数据库:"+info);}}

3.如何使用者两个新对象中的方式,替换原来的写日志的方式?

///<summary>///采用新的写日志的方式,写入到数据库中///</summary>publicclassDatabaseLogAdapter:DatabaseLog,ILogTarget{///<summary>///在重写ILogTarget接口中的的Write方法里面调用新的写日志的方式WriteLog///</summary>publicvoidWrite(stringinfo){WriteLog(info);}}///<summary>///采用新的写日志的方式,写入到文本文件///</summary>publicclassFileLogAdapter:FileLog,ILogTarget{///<summary>///在重写ILogTarget接口中的的Write方法里面调用新的写日志的方式WriteLog///</summary>publicvoidWrite(stringinfo){this.WriteLog(info);}}

4.调用依据使用的原来写日志的方法,但是确实使用的新的写日志的方式:

///<summary>///类适配器模式(AdapterPattern)///</summary>classProgram{staticvoidMain(string[]args){ILogTargetdbLog=newDatabaseLogAdapter();dbLog.Write("程序启动成功");dbLog=newFileLogAdapter();dbLog.Write("程序启动成功");}}

对象适配器模式

1.方式采用的是类适配器的方式实现了新的日志功能的迁移变化,下面我们使用对象适配器,可以区别发现两种方式的特别之处。原来写日志的方法依旧不变:Write("写日志");

///<summary>///原来的日志记录接口///</summary>publicinterfaceILogTarget{///<summary>///原来的写日志方法///</summary>voidWrite(stringinfo);}

2.现在的写日志的接口,采用的是WriteLog("写日志");里面实现了写日志的新的方式:将日志写到文件中,数据库中:

///<summary>///抽象写日志类///</summary>publicabstractclassLogAdaptee{///<summary>///写日志///</summary>publicabstractvoidWriteLog(stringinfo);}
///<summary>///写文件日志记录///</summary>publicclassFileLog:LogAdaptee{///<summary>///写日志到文件中///</summary>publicoverridevoidWriteLog(stringinfo){Console.WriteLine("记录到文本文件:"+info);}}
///<summary>///往数据库中写日志///</summary>publicclassDatabaseLog:LogAdaptee{///<summary>///重写写日志方法///</summary>publicoverridevoidWriteLog(stringinfo){Console.WriteLine("记录到数据库:"+info);}}

3.上面我们添加了FileLogAdapter 类,DatabaseLogAdapter类,继承了FileLog,DatabaseLog, ILogTarget接口,重写Write方法里面调用新的写日志的方式WriteLog,使用这样的方式进行了迁移变化。下面使用对象适配:

///<summary>///对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。///</summary>publicclassLogAdapter:ILogTarget{///<summary>///抽象写日志类///</summary>privateLogAdaptee_adaptee;publicLogAdapter(LogAdapteeadaptee){this._adaptee=adaptee;}publicvoidWrite(stringinfo){_adaptee.WriteLog(info);}}

4.在程序中的调用:

///<summary>///对象适配器模式(AdapterPattern)///</summary>classProgram{staticvoidMain(string[]args){ILogTargetdbLog=newLogAdapter(newDatabaseLog());dbLog.Write("程序启动成功");ILogTargetfileLog=newLogAdapter(newFileLog());fileLog.Write("程序启动成功");}}

比较两者的迁移变化,在类适配方式中,我们得到的适配器类DatabaseLogAdapter和FileLogAdapter具有它所继承的父类的所有的行为,同时也具有接口ILogTarget的所有行为,这样其实是违背了面向对象设计原则中的类的单一职责原则,而对象适配器则更符合面向对象的精神,所以在实际应用中不太推荐类适配这种方式。假设我们要适配出来的类在记录日志时同时写入文件和数据库,那么用对象适配器我们会这样去写:

///<summary>///对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。///</summary>publicclassLogAdapter:ILogTarget{///<summary>///抽象写日志类///</summary>privateLogAdaptee_adapteed;///<summary>///抽象写日志类///</summary>privateLogAdaptee_adapteef;publicLogAdapter(LogAdapteeadapteed,LogAdapteeadapteef){this._adapteed=adapteed;this._adapteef=adapteef;}publicvoidWrite(stringinfo){_adapteed.WriteLog(info);_adapteef.WriteLog(info);}}

调用:

///<summary>///对象适配器模式(AdapterPattern)///</summary>classProgram{staticvoidMain(string[]args){//同时写日志到文件和数据库ILogTargetdbLog=newLogAdapter(newFileLog(),newDatabaseLog());dbLog.Write("程序启动成功");}}

如果改用类适配器:我们难道使用这样的写法达到目的?

publicclassDatabaseLogAdapter:DatabaseLog,FileLog,ILogTarget{publicvoidWrite(stringinfo){this.WriteLog(info);}}

结果肯定是不能的,一个类不能具有多个基类,这样写明细有错误。所有针对不同的情况,我们应该采用合适的方式去进行适配调度。

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:.NET适配器模式简介的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Web前端JS框架可以解决什么问题下一篇:

16 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18