这时也许我们会想到修改现在的日志记录工具的API接口,但是由于版权等原因我们不能够修改它的源代码,此时Adapter模式便可以派上用场了。下面我们通过Adapter模式来使得该日志记录工具能够符合我们当前的需求。
前面说过,Adapter模式有两种实现形式的实现结构,首先来看一下类适配器如何实现。现在唯一可行的办法就是在程序中引入新的类型,让它去继承LogAdaptee类,同时又实现已有的ILogTarget接口。由于LogAdaptee有两种类型的方式,自然我们要引入两个分别为DatabaseLogAdapter和FileLogAdapter的类。 
图5 引入类适配器后的结构图
实现代码如下:
这里需要注意的一点是我们为每一种日志记录方式都编写了它的适配类,那为什么不能为抽象类LogAdaptee来编写一个适配类呢?因为DatabaseLog和FileLog虽然同时继承于抽象类LogAdaptee,但是它们具体的WriteLog()方法的实现是不同的。只有继承于该具体类,才能保留其原有的行为。public class DatabaseLogAdapter:DatabaseLog,ILogTarget
![]()
{
![]()
public void Write()
![]()
{
![]()
WriteLog();
![]()
}
![]()
}
![]()
![]()
![]()
public class FileLogAdapter:FileLog,ILogTarget
![]()
{
![]()
public void Write()
![]()
{
![]()
this.WriteLog();
![]()
}
![]()
}
![]()
我们看一下这时客户端的程序的调用方法:
下面看一下如何通过对象适配器的方式来达到我们适配的目的。对象适配器是采用对象组合而不是使用继承,类结构图如下:public class App
![]()
{
![]()
public static void Main()
![]()
{
![]()
ILogTarget dbLog = new DatabaseLogAdapter();
![]()
dbLog.Write("Logging Database...");
![]()
![]()
![]()
ILogTarget fileLog = new FileLogAdapter();
![]()
fileLog.Write("Logging File...");
![]()
}
![]()
}
![]()

图6引入对象适配器后的结构图
实现代码如下:
public class LogAdapter:ILogTarget
![]()
{
![]()
private LogAdaptee _adaptee;
![]()
![]()
![]()
public LogAdapter(LogAdaptee adaptee)
![]()
{
![]()
this._adaptee = adaptee;
![]()
}
![]()
public void Write()
![]()
{
![]()
_adaptee.WriteLog();
![]()
}
![]()
}
![]()