2011-12-19 13 views
0

私はドキュメントのような本を作成するように設計されたソフトウェアを開発中です。デコレータを使ってさまざまな機能を追加して実装しました。ここで設定可能なソフトウェアのBuilderとDecoratorパターンを設定するにはどうすればよいですか?

$this->chapter[i] = new ChapDecorator1(new ChapDecorator2(new Chapter(i))); 

課題は、これらのデコレータは、ハードコードされていることである初期化「の一例であり、sofwareの多くの繰り返しの可能性があるということ。興味深い新しいプロジェクトの変更は、古いものにバックポートされることがよくあります(これは、デコレータには別のデコレータを追加するだけです)。しかし、これでもサブクラスコードを編集する必要があります。最適な状況は、プログラマが何かを編集することなく、必要な機能を選択する実際のコンテンツ作成者です。

このケースでは、ブックがBuilderパターンを実装するオブジェクトを使用してChapterオブジェクトを作成し、それをプロジェクトの正しいデコレータにラップするのが良いことは明らかです。

最後に、ビルダーオブジェクトを動的に正しく設定するための方法を教えてください。デコレータがラップされる順序は、インタフェースコールの解決方法(LIFO)の順序を意味します。一例として、文書編集追跡はデコレータとして実装されていますが、明示的な理由から、変更が行われる前に状態を保存するように最初に評価する必要があります(最後のラッパーにする必要があります)。将来の開発のために、多くのデコレータがあると仮定して、各デコレータが優先順位のデータメンバ(整数?)のようなものを持っていれば最初に解決する必要があるものもあります。これは実行可能なソリューションのようですが、多数の優先度の高いデコレータ/モジュールが作成された場合、実装が非常に堅牢ではないと懸念しています。競合する優先順位には、たとえば多くのクラスの番号を変更する必要があります。とにかく、私は人々がこの問題について考えていたことを感謝します。

2つ目の問題は、2人のデコレータが何らかの方法で同じ機能を変更した場合です。そのような状況は可能であるべきか?各デコレータがそのドメインを指定し、競合を探すデコレータのリストをトラバースする必要がありますか?

これは、多くのデコレータが存在することを前提としており、いくつかのプロジェクトエディタがいくつかを選択し、他のものは選択しないことを前提としています。 ありがとう!

答えて

0

ビルダー・メソッドの呼び出しごとに異なるBuilderクラスを戻し、返されたBuilderクラスには、全体クラスを構築するすべてのメソッドのサブセットのみが含まれています。

これにより、同じメソッドが複数回呼び出されることを避けることができます。また、ビルド全体の順序を制御することもできます。 example of thisはここにあります。

+0

私はそれがスタートだと思っていますが、まだ私の状況には完璧ではありません。冗長性と順序には2つの問題があります。ビルダーにとって私は主に注文に関心があります。どのデコレータが最初に解決するのかという質問に答えることができます。 1つは最後に適用され、次に内向きに働きます。それは私に命令を与えますが、静的な優先順位の整数に頼らずに、データベース設定に基づいてビルダーにそれらを適用する方法を教えてください。 冗長性はデコレータに関連しています。インターフェイスコールが行われると、同じフィーチャを編集する2人のデコレータが許可されますか? – Hath995

+0

申し訳ありません私は十分に明確にしていないと思います。私はその質問を言い換えるつもりです。 – Hath995

関連する問題