与类适配器相比较,可以看到最大的区别是适配器类的数量减少了,不再需要为每一种具体的日志记录方式来创建一个适配器类。同时可以看到,引入对象适配器后,适配器类不再依赖于具体的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();
![]()
}
![]()
}
![]()
