这个用例的有效设计是什么?

时间:2014-07-25 03:29:05

标签: java design-patterns

我有一个用例,我在特定方法上启动一个计时器,看它是否需要超过x秒。如果是这样,我将在日志中记录致命错误,如下所示。

private boolean isDpxTimedOut(StopWatch stopWatch)
{
       stopWatch.stop();
       long elapsedTime = stopWatch.getNanoTime();
       Double elapsedTimeInSeconds = elapsedTime/NANO_DIVISOR;
       return (elapsedTimeInSeconds >= DPX_TIMEOUT_VALUE);
}
public void callDPX()
{
 try{
 StopWatch stopWatch = new StopWatch();
 //body of the method
 }
 catch(Exception e)
 {  
    e.printStackTrace();
 }
  finally {
              //putting a check here to see if DPX timed out and then logging a FATAL.
           if(isDpxTimedOut(stopWatch))
           {
                  log.fatal("[DPX TIMEOUT] The request took more than 12 seconds.");
           }

}

现在我有一个用例,我必须将这个stoip watch放在不同类的多个方法中。我该怎么设计呢?不同类的超时将是不同的,应该从Config文件中读取。有人能指出我对这个用例的好设计。

3 个答案:

答案 0 :(得分:0)

首先更改isDpxTimedOut,调用DPX方法将时间作为参数,以便您可以从配置文件中传递不同的数字..

设计将是..创建一个基类并将你的方法放在那里。你编写的任何类扩展了该基类。在你的类中,如果你想调用timeout方法,首先从配置文件中获取相应的时间,并使用time参数调用callDPX()。

答案 1 :(得分:0)

在这种情况下,Proxy pattern可以为您提供帮助。

  

代理是一种常用的设计模式。简而言之,代理是一个看起来像另一个对象的对象,但在场景后面添加了特殊功能。

GOF - Design Pattern

更好地解释了这一点

代理模式

  

这是一种结构模式,因为它定义了在类或实体之间创建关系的方式。代理设计模式用于提供代理或占位符对象,它引用基础对象。

     

通过充当传递实体或占位符对象,允许对象级访问控制。

Spring AOP使用相同的设计模式。

learn more...

只需在实际对象调用之前和之后包装对象添加新功能。

enter image description here

答案 2 :(得分:0)

尝试以下方面的内容:

class Executor {
    public static void execAndLogOnTimeout(Runnable runnable, long timeout) {
        // Save start time
        runnable.run();
        // Save end time
        // If time taken > timeout: log
    }
}

Executor.execAndLogOnTimeout(new Runnable() {
    @Override public void run() {
        // The code to be clocked
    }
}, Config.timeoutForThisPieceOfCode());

另一种选择是在建议中使用AOP。