责任链日志记录

发布于 2024-11-30 02:59:59 字数 515 浏览 1 评论 0原文

我有一个名为 ChainHandler 的抽象类和 ChainHandler 的许多实现。

其他程序员将编写该 ChainHandler 的其他实现。

我的程序实现了责任链设计模式。

ChainHandler 的每个具体实现都实现一个handle 方法。

public abstract void handle(SomeclassA a);

如果一个处理程序可以处理“a”,它就会处理它并且链停止。如果没有,“a”将被传递到下一个处理程序,直到它到达链的末尾。

我希望每个具体处理程序都有一个它能够处理的所有“a”的列表。但我不想让具体类开发人员记住将其写入成功列表中。

有一种优雅的方法吗?

我最好的想法如下:

1 - 在具体类中将句柄方法更改为 protected ,使其返回布尔值并将名称更改为innerhandle;

2 - 将抽象类的句柄方法更改为公共,并调用内部句柄。成功后,它将将该对象添加到列表中。

I have an abstract class called ChainHandler and many implementations of the ChainHandler.

Other programmers will write other implementations of that ChainHandler.

My program implements the Chain of Responsibility design pattern.

Each concrete implementation of the ChainHandler implements a handle method.

public abstract void handle(SomeclassA a);

If one handler can handle "a", it handles it and the chain stops. If not,"a" is passed to the next Handler until it hits the end of the chain.

I want each concrete handler to have a list of all "a"s it was able to handle. But I don't want to make the concrete classes developer to remember to write it to a list on success.

Is there a elegant way of doing it?

My best idea was the following:

1 - Change the handle method to protected at the concrete classes, make it return a boolean and change the name to innerhandle;

2 - Change the handle method at the abstract class to public and it calls the innerhandle. On success, it adds the object to the list.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

忆伤 2024-12-07 02:59:59

第二个选项肯定更好(它依赖于 模板方法模式),这对某人来说更困难实现错误的子类,您甚至可以将句柄方法设置为final,这样就没有人能够在没有注意到的情况下改变它的行为并中断。

servlet API 有这样一个例子,带有 ServletConfig 参数的 init 方法可以被重写,并且很常见的是人们忘记调用 super 和原来的 init(ServletConfig) 方法,所以你应该尽量避免同样的错误。

The second option is surely better (and it relies on the Template method pattern) making it harder for someone implementing a subclass of doing it wrong, you can even make the handle method final so no one will ever be able to change it's behavior and break without noticing it.

The servlet API has such an example, the init method that takes a ServletConfig parameter can be overridden and it's rather common to see people forgetting to call super and the original init(ServletConfig) method, so you should try to avoid this same mistake.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文