2016-12-06 48 views
3

私はこれらのパターンファミリを何度も使用してきたような気がしますが、私にとってはの定義が非常に似ているため、違いを見るのは難しいです。基本的には、それらのすべてが約ラップ別のオブジェクトまたはオブジェクトを延長するか、またはラップ余分なものとそれらのように思われる。Decorator、Wrapper、およびAdapterパターンの違いは何ですか?

レポジトリパターン上のキャッシュメカニズムを実装する簡単な例は、このような状況のようです。ここに私がおそらく始めるだろうC#の簡単なサンプルがあります。

public interface IRepository { 
    IEnumerable<T> GetItems<T>(); 
} 

public class EntityFrameworkRepository : IRepository { 
    ... 
} 

public class CachedRepository : IRepository { 

    private IRepository _repository; 
    private ICacheProvider _cache; 

    public CachedRepository(IRepository repository, ICacheProvider cache) { 
    this._repository = repository; 
    this._cache = cache; 
    } 

    public IEnumerable<T> GetItems<T>() { 
    ... 
    } 
} 

たとえば、このような状況に該当するパターンはどれですか?誰でも簡単に理論と実際の違いを明らかにすることができますか?それらが同じである理論的には

+0

[プロキシ、デコレータ、アダプタ、ブリッジパターンの違いは?](http://stackoverflow.com/questions/350404/how-do-the-proxy-decorator-adapter-and-bridge -patterns-different) – jaco0646

+0

関連:http://stackoverflow.com/questions/3489131/difference-between-the-facade-proxy-adapter-and-decorator-design-patterns – jaco0646

答えて

6

、それは他の一つのパターンを区別intentです:

  • デコ

とクラスでそれらをラップすることによって機能を追加/オブジェクトを構成することができます同じインターフェイス

  • アダプタ

既知のインターフェイス実装 なしでオブジェクトをラップすることができるため、インターフェイスに準拠します。要点は、あるインタフェースを別のインタフェースに「翻訳」することです。

  • ラッパー

は、デザインパターンとしてこれのことを聞いたことはありませんが、私はそれはあなたが私はデコレータとして分類するだろう指定例上記

のためだけの一般的な名前だとしますCacheRepositoryをdecoratesIRepositoryキャッシュ機能を追加します。

+0

OK、私は自分の答えを削除しています。 :) – lexicore

+1

私の混乱の原因は、別のパターンとして「ラッパー」でした。私が正しく覚えていれば、どこかに間違いなく読んだことがあります。その間、別の人は、「ラッパー」はむしろコーディングテクニックであることを確認しました。これは、例えばデコレータパターンを実装することを可能にします。両方の説明をいただきありがとうございます。 –

+0

良いもの!私は将来の訪問者のためのアダプタの@エクレシアの答えからちょっと盗んだ。 – Kenneth

関連する問題