我有一个名为ChainHandler的抽象类和ChainHandler的许多实现。
其他程序员将编写该ChainHandler的其他实现。
我的程序实现了责任链设计模式。
ChainHandler的每个具体实现都实现了一个句柄方法。
public abstract void handle(SomeclassA a);
如果一个处理程序可以处理“a”,它会处理它并且链停止。如果没有,“a”将传递给下一个处理程序,直到它到达链的末尾。
我希望每个具体的处理程序都有一个它能够处理的所有“a”的列表。但我不想让具体的类开发人员记住在成功时将其写入列表。
有一种优雅的方式吗?
我最好的想法如下:
1 - 在具体类中将handle方法更改为protected,使其返回布尔值并将名称更改为innerhandle;
2 - 将抽象类的handle方法更改为public,并调用innerhandle。成功时,它会将对象添加到列表中。
答案 0 :(得分:2)
第二个选项肯定更好(并且它依赖于Template method pattern)使得实现子类的人更难以做错,你甚至可以使句柄方法最终所以没有人能够改变它的行为并在没有注意到的情况下突破它。
servlet API有这样一个例子, init 方法可以覆盖 ServletConfig 参数,并且看到人们忘记调用super和原始版本是很常见的 init(ServletConfig)方法,所以你应该尽量避免同样的错误。