与类适配器相比较,可以看到最大的区别是适配器类的数量减少了,不再需要为每一种具体的日志记录方式来创建一个适配器类。同时可以看到,引入对象适配器后,适配器类不再依赖于具体的DatabaseLog类和FileLog类,更好的实现了松耦合。
再看一下客户端程序的调用方法:
通过Adapter模式,我们很好的实现了对现有组件的复用。对比以上两种适配方式,可以总结出,在类适配方式中,我们得到的适配器类DatabaseLogAdapter和FileLogAdapter具有它所继承的父类的所有的行为,同时也具有接口ILogTarget的所有行为,这样其实是违背了面向对象设计原则中的类的单一职责原则,而对象适配器则更符合面向对象的精神,所以在实际应用中不太推荐类适配这种方式。再换个角度来看类适配方式,假设我们要适配出来的类在记录日志时同时写入文件和数据库,那么用对象适配器我们会这样去写:public class App { public static void Main() { ILogTarget dbLog = new LogAdapter(new DatabaseLog()); dbLog.Write("Logging Database..."); ILogTarget fileLog = new LogAdapter(new FileLog()); fileLog.Write("Logging Database..."); } }
如果改用类适配器,难道这样去写:public class LogAdapter:ILogTarget { private LogAdaptee _adaptee1; private LogAdaptee _adaptee2; public LogAdapter(LogAdaptee adaptee1,LogAdaptee adaptee2) { this._adaptee1 = adaptee1; this._adaptee2 = adaptee2; } public void Write() { _adaptee1.WriteLog(); _adaptee2.WriteLog(); } }
显然是不对的,这样的解释虽说有些牵强,也足以说明一些问题,当然了并不是说类适配器在任何情况下都不使用,针对开发场景不同,某些时候还是可以用类适配器的方式。public class DatabaseLogAdapter:DatabaseLog,FileLog,ILogTarget { public void Write() { //WriteLog(); } }