首先定义一个Clock接口。并为Clock实现两个具体类,一个是NtpClockWrapper,顾名思义其实就是实现了Clock的NtpClock,另一个是SystemClock,它就提供系统当前时间作为标准时间。
package shannon.demo;
/**
* <code>Clock</code> is an interface for all the clock to provide time.
* @author Shannon Qian
*/
public interface Clock {
/**Returns the time in millusecond.
* @return - the time in millusecond
*/
public long getTime();
}
同时,我们定义一个UnitTestFirewall类,维护一个debugging标记。并提供一个getClock()类工厂方法,返回Clock对象。
package shannon.demo;
import thirdparty.any.NtpClock;
/**
* <code>UnitTestFirewall</code> is the facility to
* ease unit test
* @author Shannon Qian
*/
public final class UnitTestFirewall {
private static boolean debugging=false;
/**Returns true if it's in debugging mode, else false.
* @return the debugging
*/
public static boolean isDebugging() {
return debugging;
}
/**Sets Debugging flag as true if it's time to unit test.
* @param on - the debugging to set, true for on and false
* for off
*/
public static void setDebugging(boolean on) {
UnitTestFirewall.debugging = on;
}
private final static NtpClock _ntpClock=new NtpClock();
private static class NtpClockWrapper implements Clock {
public long getTime() {
return _ntpClock.getTime();
}
}
private static class SystemClock implements Clock {
public long getTime() {
return System.currentTimeMillis();
}
}
private static SystemClock sysClock = null;
private static NtpClockWrapper ntpClock = null;
/**Returns the Clock instance for <code>SystemTimeSynchronizer
* </code>'s invocation.
* @return - Clock instance
*/
public static Clock getClock() {
if(debugging) {
if(sysClock == null)
sysClock = new SystemClock();
return sysClock;
}
else {
if(ntpClock == null)
ntpClock = new NtpClockWrapper();
return ntpClock;
}
}
}
(未完待续)