2

私はChainHandlerと呼ばれる抽象クラスとChainHandlerの多くの実装を持っています。

他のプログラマーは、そのChainHandlerの他の実装を作成します。

私のプログラムはChainofResponsibilityデザインパターンを実装しています。

ChainHandlerの具体的な実装はそれぞれ、handleメソッドを実装します。

public abstract void handle(SomeclassA a);

1つのハンドラーが「a」を処理できる場合、それを処理してチェーンを停止します。そうでない場合、「a」はチェーンの最後に到達するまで次のハンドラーに渡されます。

各具象ハンドラーに、処理できたすべての「a」のリストを持たせたい。しかし、具体的なクラスの開発者に、成功時にリストに書き込むことを忘れないようにしたくありません。

それを行うためのエレガントな方法はありますか?

私の最高のアイデアは次のとおりです。

1-handleメソッドをconcreteクラスでprotectedに変更し、ブール値を返すようにして、名前をinnerhandleに変更します。

2-抽象クラスのhandleメソッドをpublicに変更すると、innerhandleが呼び出されます。成功すると、オブジェクトがリストに追加されます。

4

1 に答える 1

2

2番目のオプションは確かに優れており(そしてそれはTemplateメソッドパターンに依存しています)、誰かがそれを間違って実行するサブクラスを実装するのを難しくします。handleメソッドをfinalにすることもできるので、誰もその動作を変更して壊すことができなくなります気づかずに。

サーブレットAPIにはそのような例があり、 ServletConfigパラメーターを受け取るinitメソッドはオーバーライドでき、superと元のinit(ServletConfig)メソッドの呼び出しを忘れる人がよく見られるので、この同じ間違いを避けるようにしてください。

于 2011-08-18T22:44:39.587 に答える