通过模板方法模式将逻辑与日志记录分开

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。客户端永远不需要知道它拥有哪一个。

Prefer association over inheritance.