技术开发 频道

从一个输出日志的实例分析Java的代理机制



二、通过面向接口编程实现日志输出

通过前面的示例程序,读者可以了解到以前添加日志信息方法的缺点。下面主要通过面向接口编程来改进这个缺点。其实现思路是:首先把执行考勤审核的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实现日志信息的输出,而不用再每个类里面都写日志信息输出的代码,从而实现了日志信息的代码重用。


0
相关文章