如何分隔业务逻辑和指标日志?

时间:2019-04-28 08:51:47

标签: java spring design-patterns

在许多应用程序中,我们需要记录统计数据指标,例如历史记录,度量值等。这将污染业务逻辑。例如:

boolean buy(int id) {
  metrics.increament(); // for qps maybe.. 
  int remain = checkRemain();
  metrics.hist(remain); // log remain amount..
  if (remain > 0)
    return true;
  else
    return false;
}

我希望只能写下biz逻辑,例如:

boolean buy(int id) {
  int remain = checkRemain();
  if (remain > 0)
    return true;
  else
    return false;
}

但是我也可以获取指标。

我的问题是:分离业务逻辑和指标日志的最佳实践是什么?

我知道面向方面的编程可以解决这个问题,我还有其他选择吗?

1 个答案:

答案 0 :(得分:3)

如果您不想使用AOP,则可以实现观察者

https://en.wikipedia.org/wiki/Observer_pattern

定义一个观察者接口

public interface Observer {
    void buyed(int id, int remain);
}

然后在业务逻辑类中使用:

 private List<Observer> observers = new ArrayList<>();
 public void addObserver(Observer observer) {
    this.observers.add(observer);
 }

 boolean buy(int id){    
    int remain = checkRemain();
    for (Observer observer : this.observers) {
        observer.buyed(id, remain);
    }
    if (remain > 0){  
      return true;
    } else
     return false;
}

Metrics类实现观察者接口

class Metrics implements Observer {
   void buyed(int id, int remain){
       metrics.increment();
       metrics.hist(remain); 
   }
....