通过模板方法模式将逻辑与日志记录分开
Separate logic from logging via template method pattern
我可以使用此模板方法模式将逻辑与日志记录和异常处理分开,还是 "bad practice"?
例如我有这个代码:
public abstract class Parent {
private final Logger log = LoggerFactory.getLogger(getClass());
public void eat() {
try {
doEat();
} catch (SomeException1 e) {
log.debug("some text");
throw new CustomException1();
}
}
protected abstract void doEat();
public void sleep() {
try {
doSleep();
} catch (SomeException2 e) {
log.debug("some text");
throw new CustomException2();
}
}
protected abstract void doSleep();
}
还有我的childclass:
public class Child extends Parent {
@Override
protected void doEat() {
//some logic
}
@Override
protected void doSleep() {
//some logic
}}
我不会有方法 doEat()
和 doSleep()
的不同实现。
我想知道这是否值得,是否'bad practice'。
如果该模式解决了您遇到的问题,并且您确信它以后不会引起更多问题,我认为没有任何问题。
我个人的偏好是装饰器模式。在 "Template" 版本中,Child
扩展了 Parent
,日志记录行为并没有真正与逻辑分离,它只是被隐藏了。唯一的好处是它可以在 Parent
的多个子类型中重复使用。将它们真正分开意味着您可以独立地更改它们中的任何一个,而无需客户知道。 "Decorator" 版本可能是这样工作的:
public class Thing implements MyBehaviour {
@Override
public void eat() {
//some logic
}
}
然后,对于日志记录:
public class LoggingThing implements MyBehaviour {
public MyBehaviour delegate;
public LoggingThing(MyBehaviour delegate) {
this.delegate = delegate;
}
@Override
public void eat() {
try {
delegate.eat();
} catch (MyException e) {
// extra behaviour
}
}
}
现在日志记录行为与 "eat" 行为完全分开。你可以有一个记录日志的 MyBehaviour
,你可以有一个不记录日志的 MyBehaviour
,你可以有一个做你想让它做的任何其他事情的 MyBehaviour
。客户端永远不需要知道它拥有哪一个。
我可以使用此模板方法模式将逻辑与日志记录和异常处理分开,还是 "bad practice"?
例如我有这个代码:
public abstract class Parent {
private final Logger log = LoggerFactory.getLogger(getClass());
public void eat() {
try {
doEat();
} catch (SomeException1 e) {
log.debug("some text");
throw new CustomException1();
}
}
protected abstract void doEat();
public void sleep() {
try {
doSleep();
} catch (SomeException2 e) {
log.debug("some text");
throw new CustomException2();
}
}
protected abstract void doSleep();
}
还有我的childclass:
public class Child extends Parent {
@Override
protected void doEat() {
//some logic
}
@Override
protected void doSleep() {
//some logic
}}
我不会有方法 doEat()
和 doSleep()
的不同实现。
我想知道这是否值得,是否'bad practice'。
如果该模式解决了您遇到的问题,并且您确信它以后不会引起更多问题,我认为没有任何问题。
我个人的偏好是装饰器模式。在 "Template" 版本中,Child
扩展了 Parent
,日志记录行为并没有真正与逻辑分离,它只是被隐藏了。唯一的好处是它可以在 Parent
的多个子类型中重复使用。将它们真正分开意味着您可以独立地更改它们中的任何一个,而无需客户知道。 "Decorator" 版本可能是这样工作的:
public class Thing implements MyBehaviour {
@Override
public void eat() {
//some logic
}
}
然后,对于日志记录:
public class LoggingThing implements MyBehaviour {
public MyBehaviour delegate;
public LoggingThing(MyBehaviour delegate) {
this.delegate = delegate;
}
@Override
public void eat() {
try {
delegate.eat();
} catch (MyException e) {
// extra behaviour
}
}
}
现在日志记录行为与 "eat" 行为完全分开。你可以有一个记录日志的 MyBehaviour
,你可以有一个不记录日志的 MyBehaviour
,你可以有一个做你想让它做的任何其他事情的 MyBehaviour
。客户端永远不需要知道它拥有哪一个。