在许多应用程序中,我们需要记录统计数据指标,例如历史记录,度量值等。这将污染业务逻辑。例如:
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;
}
但是我也可以获取指标。
我的问题是:分离业务逻辑和指标日志的最佳实践是什么?
我知道面向方面的编程可以解决这个问题,我还有其他选择吗?
答案 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);
}
....