2

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

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

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

ChainHandler 的每个具体实现都实现了一个句柄方法。

public abstract void handle(SomeclassA a);

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

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

有没有优雅的方法呢?

我最好的想法是:

1 - 在具体类中将句柄方法更改为受保护,使其返回布尔值并将名称更改为内部句柄;

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

4

1 回答 1

2

第二个选项肯定更好(并且它依赖于模板方法模式)使得实现子类的人更难做错,你甚至可以使句柄方法最终,所以没有人能够改变它的行为并打破没有注意到它。

servlet API 有这样一个例子,带有ServletConfig参数的init方法可以被覆盖,并且经常看到人们忘记调用 super 和原始的init(ServletConfig)方法,所以你应该尽量避免同样的错误。

于 2011-08-18T22:44:39.587 回答