为了一个学校项目,我需要用Java编写一个简单的服务器,不断监听一个传入目录,并将文件从该目录移动到其他地方。服务器需要记录信息和错误消息,所以我想可以使用代理模式来实现。因此,我创建了以下ServerInterface:
public interface ServerInterface extends Runnable {
public void initialize(String repPath, ExecutorInterface executor, File propertiesFile) throws ServerInitException;
public void run();
public void terminate();
public void updateHTML();
public File[] scanIncomingDir();
public List<DatasetAttributes> moveIncomingFilesIfComplete(File[] incomingFiles);
}
然后我创建了一个实现了真实对象的Server
类和一个代理类ProxyServer
。此外,Server
还有一个工厂方法,用于创建一个ProxyServer
对象,但将其返回为ServerInterface
。
代理对象上的run
方法如下所示:
@Override
public void run(){
log(LogLevels.INFO, "server is running ...");
while( !stopped ){
try {
File[] incomingContent = scanIncomingDir();
moveIncomingFilesIfComplete(incomingContent);
updateHTML();
pause();
} catch (Exception e) {
logger.logException(e, new Timestamp(timestampProvider.getTimestamp()));
pause();
}
}
log(LogLevels.INFO, "server stopped");
}
在
try
语句中调用的函数只是记录并传递调用给真实对象。到目前为止,一切都很好。但现在我已经以这种方式在代理对象中实现了run
方法,真实对象中的run
方法变得过时,因此为空(terminate
方法也是如此)。所以我问自己:这样可以吗?代理模式应该是这样实现的吗?
我认为,我混淆了“真实”和“代理”的行为……通常,真实服务器应该被困在while循环中,而不是代理服务器,对吧?我试图避免混淆这一点,但两种方法都不令人满意:
- 我可以在真实对象中实现
run
方法,然后将代理对象交给真实对象,以便在while循环期间仍能记录日志。但这样真实对象就会做一些记录,这正是我写代理的原因所在。
- 我可以说,只有代理服务器是可运行的,因此从接口中删除run
和terminate
,但这将破坏代理模式。我应该使用其他的设计吗?还是我看到了没有问题?