2011-08-18 128 views
2

我有一个叫做ChainHandler的抽象类和ChainHandler的许多实现。责任链日志记录

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

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

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

public abstract void handle(SomeclassA a); 

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

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

有没有这样做的优雅方式?

我最好的想法是以下几点:

1 - 更改处理方法在具体的类保护,使其返回一个布尔值,并更改名称innerhandle;

2 - 将抽象类中的handle方法更改为public,并调用innerhandle。成功时,它将该对象添加到列表中。

+0

@TrueWill谢谢。 :) – pablosaraiva

回答

2

第二个选项是肯定更好(这依赖于Template method pattern)使其更难有人实现这样做是错误的子类,你甚至可以使手柄方法最终所以没有人会能够改变它的行为和突破没有注意到它。

该servlet API有这样一个例子,的init方法,它接受的ServletConfig参数可以被覆盖,它是相当普遍看到人们忘记超级调用和原始的init(ServletConfig类)方法,所以你应该尽量避免这个相同的错误。

+0

我完全忘了模板方法模式,它正是我想要的。非常感谢你! – pablosaraiva