二、通过面向接口编程实现日志输出
通过前面的示例程序,读者可以了解到以前添加日志信息方法的缺点。下面主要通过面向接口编程来改进这个缺点。其实现思路是:首先把执行考勤审核的doAuditing()方法提取出来成为接口,然后通过一个实体类来实现这个方法,在这个方法里编写具体的考勤审核的业务逻辑,接着通过一个代理类来进行日志输出,最后编写测试程序,查看输出结果。具体步骤如下:
(1)在com.gc.impl包中,建立一个接口TimeBookInterface。TimeBookInterface.java的示例代码如下:
//******* TimeBookInterface.java**************
package com.gc.impl;
import org.apache.log4j.Level;
//通过面向接口编程实现日志输出
public interface TimeBookInterface {
public void doAuditing(String name);
}
(2)在com.gc.action包中,使前面已经建立好的类TimeBook实现接口TimeBookInterface,在doAuditing()方法中编写具体的考勤审核代码。TimeBook.java的示例代码如下:
//******* TimeBook.java************** package com.gc.action; import com.gc.impl.TimeBookInterface; public class TimeBook implements TimeBookInterface { public void doAuditing(String name) { //审核数据的相关程序 …… } }
(3)编写一个代理类,用来实现日志的输出,在该类中针对前面的接口TimeBookInterface编程,而不针对具体的类,从而实现具体业务逻辑与日志输出代码。TimeBookProxy.java的示例代码如下:
//******* TimeBookProxy.java************** package com.gc.action; import org.apache.log4j.Level; import org.apache.log4j.Logger; import com.gc.impl.TimeBookInterface; public class TimeBookProxy { private Logger logger = Logger.getLogger(this.getClass().getName()); private TimeBookInterface timeBookInterface; //在该类中针对前面的接口TimeBookInterface编程,而不针对具体的类 public TimeBookProxy(TimeBookInterface timeBookInterface) { this.timeBookInterface = timeBookInterface; } //实际业务处理 public void doAuditing(String name) { logger.log(Level.INFO, name + " 开始审核数据...."); timeBookInterface.doAuditing(name); logger.log(Level.INFO, name + " 审核数据结束...."); } }
(4)修改测试程序TestHelloWorld,把类TimeBook当作参数传入代理类TimeBookProxy中,从而实现对具体负责考勤审核类TimeBook的调用。TestHelloWorld.java的示例代码如下:
//******* TestHelloWorld.java**************
package com.gc.test;
import com.gc.action.TimeBook;
import com.gc.action.TimeBookProxy;
public class TestHelloWorld {
public static void main(String[ ] args) {
//这里针对接口进行编程
TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
timeBookProxy .doAuditing("张三");
}
}
(5)运行测试程序,可以得到通过TimeBookProxy类输出日志信息,如图5.2所示。
图5.2 通过TimeBookProxy类输出日志信息
和前面一个日志输出做对比,可以看到,在这个示例中,具体负责考勤审核的业务逻辑代码和日志信息的代码分离开了,并且以后只要实现了接口TimeBookInterface的类,都可以通过代理类TimeBookProxy实现日志信息的输出,而不用再每个类里面都写日志信息输出的代码,从而实现了日志信息的代码重用。