1

私はそのようなものに要約できるオープンソースライブラリを構築しています:

class SuperThing {
    public function doStuff($object) {
        // ...
    }
}

ライブラリのユーザーがカスタム動作を追加できるようにしたいと考えています。

たとえば、操作の特定の時点でログを挿入したり、特定の時点でオブジェクトを変更したりする場合があります。

私はそれを行う2つの方法を見ます:

  • テンプレート メソッドパターンは適切に思えますが、保護されたメソッド ( など) を大量に追加する必要あり、ライブラリのユーザーは自分の動作を追加するためにクラスを拡張する必要があります。beforeDoingThingA()afterDoingThingA()

  • イベントの使用:SuperThing::doStuff()イベントを発生させ、ユーザーは好きなように登録できます。

イベントの使用は、私にとってよりシンプルで明確で保守しやすいように思えます...

しかし、イベントは主に、何かが起こったというメッセージを送ることだと思います。誰かが操作に「フック」して一部のオブジェクトを変更することはできません。多分私はこれについて間違っています。

では、イベントはこの状況に適していますか? そうでない場合、テンプレート メソッド パターンに代わるものはありますか?

4

2 に答える 2

0

いつでも複数のパターンを組み合わせることができます。この例では、イベント システムとテンプレート メソッドの両方を提供してみませんか? そうすれば、ユーザーはどちらか (または両方) を選択して、自分のやりたいことを実行できます。

ただし、実行している内容によっては、テンプレート メソッドでは不十分な場合があります。「パイプライン」を作成している場合、ユーザーがさまざまな組み合わせでつなぎ合わせて必要なことを実行し、パイプラインの実行時に発生するイベントをリッスンできる小さな交換可能なコンポーネントを作成することがよくあります。

パイプラインは非常に単純で、提供された順序でコンポーネントを実行するだけで (コマンド パターンだと思います)、パイプラインとコンポーネントの両方がリスナーにイベントを発生させることができます。

于 2013-09-19T19:20:39.217 に答える