.NET适配器模式讲解(2)

/// <summary> /// 往数据库中写日志 /// </summary> public class DatabaseLog:LogAdaptee { /// <summary> /// 重写写日志方法 /// </summary> public override void WriteLog(string info) { Console.WriteLine("记录到数据库:"+info); } }

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

/// <summary> /// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。 /// </summary> public class LogAdapter:ILogTarget { /// <summary> /// 抽象写日志类 /// </summary> private LogAdaptee _adaptee; public LogAdapter(LogAdaptee adaptee) { this._adaptee = adaptee; } public void Write(string info) { _adaptee.WriteLog(info); } }

4.在程序中的调用:

/// <summary> /// 对象适配器模式(Adapter Pattern) /// </summary> class Program { static void Main(string[] args) { ILogTarget dbLog = new LogAdapter(new DatabaseLog()); dbLog.Write("程序启动成功"); ILogTarget fileLog = new LogAdapter(new FileLog()); fileLog.Write("程序启动成功"); } }

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

/// <summary> /// 对象适配,继承ILogTarget,里面有LogAdaptee抽象日志类对象。 /// </summary> public class LogAdapter:ILogTarget { /// <summary> /// 抽象写日志类 /// </summary> private LogAdaptee _adapteed; /// <summary> /// 抽象写日志类 /// </summary> private LogAdaptee _adapteef; public LogAdapter(LogAdaptee adapteed, LogAdaptee adapteef) { this._adapteed = adapteed; this._adapteef = adapteef; } public void Write(string info) { _adapteed.WriteLog(info); _adapteef.WriteLog(info); } }

调用:

/// <summary> /// 对象适配器模式(Adapter Pattern) /// </summary> class Program { static void Main(string[] args) { //同时写日志到文件和数据库 ILogTarget dbLog = new LogAdapter(new FileLog(), new DatabaseLog()); dbLog.Write("程序启动成功"); } }

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

public class DatabaseLogAdapter : DatabaseLog, FileLog, ILogTarget { public void Write(string info) { this.WriteLog(info); } }

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjyzjd.html