web-dev-qa-db-ja.com

swiftのデコレータデザインパターン

私は「ヘッドファーストデザインパターン」を読んでいます( ここで、本に記載されている正確な例を見つけることができます

デコレーターのデザインパターンを試してみたところ、私がすべてになるまですべてがくっきりと明確でした これに遭遇しました

彼らはデコレータを使用して説明しています

  1. Extensions。クラスにプロパティを追加できないため、「拡張機能」を使用してクラスを拡張してもデコレータのデザインパターンは得られないと思います。私が理解しているように、デコレータの鍵は他のオブジェクトを無限にラップできることですが、ここでは不可能ですが、継承せずに既存のクラスに機能を追加できます。

  2. 委任。ここでの委任は完全に文脈外です。委任自体はデザインパターンではありませんか?

3
Saqib Saud

「Head first design pattern」という本は正しいと思います。

  1. Wikipedia のように、このパターンは、「staticallyまたは動的に、動作に影響を与えることなく、個々のオブジェクトに動作を追加できるようにします。同じクラスの他のオブジェクトの動作」。 「拡張」はオブジェクトに静的に機能を追加するものであり、動作はメソッドを追加することによってのみ追加できます。新しいプロパティは必要ありません(これは必須の条件ではありません)。この stackoverflowの質問 は同様のことについて議論しました。

  2. 委任はパターンと見なすことができ、デコレータパターンに従って既存のオブジェクトに動作を追加するために利用できます。以下のリンクをご覧ください: https://stackoverflow.com/questions/3929996/gof-explanation-of-the-decorator-pattern-is-confusing-or-just-plain-wrong and http://lgiordani.com/blog/2014/05/19/method-overriding-in-python/

お役に立てば幸いです。ありがとう。

3
Snesh

保存されたプロパティを追加することはできませんが、computedプロパティを追加することはできます。計算されたプロパティは、格納されたプロパティのように機能できます。実際 ObjCは便利な呼び出しのセットを提供します 実際に簡単ではない場合でも、そうですね...少なくとも、難しくはありません。

パフォーマンスは期待どおりではないかもしれませんが、パフォーマンスが重要な場合は、「パターン実装の純粋性」をあきらめて、いくつかのプロパティを適切なクラスに移動する必要がある場合に、プロファイラーから通知されます。

1
Stripes

クラスに属性とメソッドを直接追加することはできませんが、デコレータで行うことができます。デコレータはスーパータイプの構成なので、デコレータはメソッドと属性が追加された基本オブジェクトであると言えます。サブクラスとまったく同じように、追加または変更されたメソッドと属性を持つスーパークラスがあります。

典型的なデコレーターでは、動作の一部は、関連付けられた基本オブジェクトで定義されているものとまったく同じです。したがって、関連付けられたオブジェクトで同じメソッドを呼び出すだけで、この動作を具体化するメソッドを実装できます。そのため、Decoratorデザインパターンを委任メカニズムとして使用できると言えます。

他のパターンでパターン(の一部)を見つけることは比較的一般的です。たとえば、デコレータを特別な種類のプロキシと見なすことができます。

1
mgoeminne