Soru .NET Framework'te hangi tasarım desenleri kullanılır?


.NET Framework'deki hangi sınıflar, dekoratör, fabrika vb. Gibi çeşitli tasarım desenlerini uygular?


25
2017-07-15 04:37


Menşei


MSDN'de çerçeve cheet-sheet tasarım desenleri: msdn.microsoft.com/en-us/magazine/cc188707.aspx Bu yardımcı olur umarım! - RBT
@RBT'den güncellenen bağlantı - web.archive.org/web/20150527185017/https://msdn.microsoft.com/... - Abhinav Galodha


Cevaplar:


Peki, tasarım kalıpları tüm .NET platformunda kullanıldığından, sormanız muhtemelen çok kapsamlı bir listedir. İşte başımın üstünden düşünebileceğim bazı örnekler:

adaptör

adaptör köprüleme sistemleri ve platformlarının ortak bir mekanizması olan model, .NET çerçevesinde çeşitli şekillerde uygulanmaktadır. Bunun .NET'in en yaygın örneklerinden biri Runtime Callable Wrappers veya RCW's. RCW'ler, tlbimp.exe Program, .NET yönetilen kodun bir .NET API aracılığıyla eski COM koduna kolayca bağlanmasına izin veren adaptörler sağlar.

Fabrika Yöntemi

fabrika metodu desen muhtemelen en iyi bilinen modellerden biridir. .NET çerçevesinde, özellikle ilkel zamanlarda, ancak diğer pek çok alanda oldukça yaygın olarak uygulanır. Bu modelin çerçevedeki mükemmel bir örneği, diğer ortak ilkellerden ortak ilkelleri yaratmak için bir dizi yöntem sunan Dönüştürme sınıfıdır.

Ek olarak, bu modelin bir başka yaygın şekli, birçok ilkel ve temel tipte bulunan .Parse () ve .TryParse () yöntemleridir.

yineleyici

yineleyici desen, bir çift arabirim ve bazı dil yapıları, foreach ve C # yeild anahtar sözcüğüyle uygulanır. IEnumerable arabirim ve genel karşılığı, .NET çerçevesinde düzinelerce koleksiyon tarafından gerçekleştirilir ve çok çeşitli veri kümelerinin kolay ve dinamik bir şekilde yinelenmesi sağlanır:

IEnumerable<T>
IEnumerator<T>

foreach(var thing in someEnumerable)
{
   //
}

yeild C # anahtar kelimesi, gerçek bir yineleyici gerçekleşmesi, sadece iterasyon talep edildiğinde bir döngü boyunca bir iterasyonun işlenmesi maliyetine neden olur:

IEnumerable<string> TokenizeMe(string complexString)
{
    string[] tokens = complexString.Split(' ');
    foreach (string token in toekens)
    {
        yield return token;
    }
}

inşaatçı

inşaatçı desen, .NET çerçevesinde birkaç kez uygulanır. Birkaç not, bağlantı dizisi oluşturucularıdır. Bağlantı dizeleri seçici bir şey olabilir ve bunları çalışma zamanında dinamik olarak oluşturmak bazen bir acı olabilir. Bağlantı Dizesi Oluşturucu sınıfları, oluşturucu modelini ideal olarak gösterir:

string connectionString = new SqlConnectionStringBuilder
{
    DataSource = "localhost",
    InitialCatalog = "MyDatabase",
    IntegratedSecurity = true,
    Pooling = false
}.ConnectionString;

UriBuilder gibi .NET çerçevesindeki diğer sınıflar da oluşturucu modelini uygular.

Gözlemci

gözlemci desen, bir sınıfın diğerinin etkinliklerini izlemesine izin veren ortak bir düzendir. .NET 4'ten itibaren, bu kalıp iki şekilde desteklenir: dil ile tümleşik olaylar (sıkı bir şekilde bağlanmış gözlemciler) ve IObservable / IObserver arabirimleri (gevşek şekilde bağlanmış olaylar) aracılığıyla.

Klasik dil olaylar faydalanmak delegelerveya olaydaki geri bildirimleri izlemek için güçlü yazılan işlev işaretçileri Etkinlik özellikleri. Bir olay tetiklendiğinde, takip edilen geri aramaların her birini sırayla yürütür. Bunun gibi olaylar, .NET çerçevesi genelinde yaygın olarak kullanılır.

public class EventProvider
{
    public event EventHandler SomeEvent;

    protected virtual void OnSomeEvent(EventArgs args)
    {
        if (SomeEvent != null)
        {
            SomeEvent(this, args); // Trigger event
        }
    }
}

public class EventConsumer
{
    public EventConsumer(EventProvider provider)
    {
        provider.SomeEvent += someEventHandler; // Register as observer of event
    }

    private void someEventHandler(EventArgs args)
    {
        // handle event
    }
}

.NET 4 çerçevesiyle yeni, gevşek birleştirilmiş olaylar. Bunlar uygulanarak gerçekleştirilir IObservable<out T>ve IObserver<in T> Orijinali daha doğrudan destekleyen arayüzler Gözlemci tasarım deseni Bildiğim herhangi bir .NET framework türüyle doğrudan uygulanmazken, modelin çekirdek altyapısı .NET 4'ün ayrılmaz bir parçasıdır.

public class SomethingObservable: IObservable<SomethingObservable>
{
    private readonly List<IObserver<SomethingObservable>> m_observers;

    public IDisposable Subscribe(IObserver<SomethingObservable> observer)
    {
        if (!m_observers.Contains(observer))
        {
            m_observers.Add(observer);
        }
        var unsubscriber = new Unsubscriber(m_observers, observer)
        return unsubscriber;        
    }

    private class Unsubscriber: IDisposable
    {
        public Unsubscriber(IList<IObserver<SomethingObservable>> observers, IObserver<SomethingObservable> observer)
        {
            m_observers = observers;
            m_observer = observer;
        }

        private readonly IList<IObserver<SomethingObservable>>  m_observers;
        private readonly IObserver<SomethingObservable> m_observer;

        public void Dispose()
        {
            if (m_observer == null) return;
            if (m_observers.Contains(m_observer))
            {
                m_observers.Remove(m_observer);
            }
        }
    }
}

Dekoratör

dekoratör desen, tek bir taban türü aracılığıyla davranışın alternatif temsillerini veya biçimlerini sağlamanın bir yoludur. Sıklıkla, ortak bir işlev kümesi gereklidir, ancak bu işlevin gerçek uygulaması değişmelidir. .NET çerçevesinde bunun mükemmel bir örneği Stream sınıfı ve türevleridir. .NET'teki tüm akışlar aynı temel işlevselliği sağlar, ancak her akış farklı işlev görür.

  • Akış
    • MemoryStreambaytlık
    • BufferedStream
    • Dosya akışı
      • IsolatedStorageFileStream
    • PipeStream
      • AnonymousPipeClientStream
      • AnonymousPipeServerStream
      • NamedPipeClientStream
      • NamedPipeServerStream
    • CryptoStream
    • GZipStream

.NET çerçevesinde pek çok başka tasarım deseni kullanılır. .NET'in neredeyse her yönü, dilden çerçeveye temel çalışma zamanı kavramlarına, ortak tasarım kalıplarına dayanmaktadır. ASP.NET gibi .NET çerçevesinin önemli kısımları kendi içinde ve kendileridir. Örneğin, MVC'nin web varyantının bir uygulaması olan ASP.NET MVC çerçevesini veya Model-View-Controller. WPF ve Silverlight UI çerçeveleri doğrudan MVVM adlı bir modeli destekler veya Model-View-ViewModel. ASP.NET boru hattının kendisi de dahil olmak üzere bir dizi yakalama filtresi, sayfa denetleyicisi, yönlendiricivb. Son olarak, en yaygın kullanılan modellerden biri, bileştirme, kompozisyon.NET çerçevesinde bu kadar kapsamlı bir şekilde kullanılmakta olup, muhtemelen tüm çerçevenin en temel kalıplarından biridir.


40
2017-07-15 05:15



+1, çok eksiksiz ve ayrıntılı cevap - Thomas Levesque
Güzel. Komut şablonunun zinciri her yerde mi uygulandı? - Srikar Doddi
Cephe deseninin kullanıldığı herhangi bir fikir? - Anil Purswani
@AnilPurswani - zejuel ekledi Cevap cephe deseni hakkında konuşmak. - RBT


Başımın üstünden:

  • Soyut fabrika ADO.NET 2.0 altyapısında desen kullanılır (DbProviderFactory sınıf)
  • Şablon Yöntemi desen çerçevenin birçok yerinde kullanılır (WinForms, WPF ...)
  • inşaatçı desen de sıklıkla kullanılır (DbConnectionStringBuilder, UriBuilder...)
  • Ben önceden tanımlanmış örnekleri (statik özellikleri) düşünüyorum StringComparer, Encoding, Color, vb bir varyantı Prototip Desen
  • vekil .NET remoting kullandığınızda desen her yerde
  • Olaylar bir varyantıdır Gözlemci Desen
  • yineleyici desen koleksiyonlarda kullanılır
  • strateji Örneğin, kriptografi derslerinde desen kullanılır

Muhtemelen daha fazla örnek var, ama şu an düşünebildiğim bu kadar ...


5
2017-07-15 05:09





Ayrıca, NullObject

  • String.Empty;
  • EventArgs.Empty;

4
2017-07-15 08:47



En özlü tasarım deseni ve hassas gözlem :) - RBT


  • Ziyaretçi Kalıbı içinde ExpressionVisitor sınıf (Syste.Linq.Expression ad).
  • Adaptör kalıbı içinde System.Web.Abstractions - Çeşitli Web sınıflarını tamamlayın (HttpRequest, HttpResponse) daha fazla test edilebilir bir şekilde - yani HttpResponseBase.
  • Fabrika Yöntemi - Activator.CreateInstance - Belirtilen nesnenin bir örneğini oluşturur.
  • Yineleyici desen - tüm uygulamaları IEnumerable.

3
2017-07-15 05:13



Cephe kalıbı bir soyutlama sağlamak anlamına gelmez ... bu, birkaç alt sisteme tek bir giriş noktasıdır - Thomas Levesque


Prototip - Prototip bir örnek kullanarak oluşturulacak nesnelerin türünü belirtin ve bu prototipi kopyalayarak yeni nesneler oluşturun.

ICloneable Clone () yöntemi ile arabirim, prototipin klasik örneğidir.


1
2017-12-02 17:27





Sağlayıcı deseni - kullanılan MembershipProvider, RoleProvider, ProfileProvider.


0
2017-07-15 05:15



Ve işte bu kalıbı kullanmanıza yardımcı olabilecek güzel bir Visual Studio Şablonu: cuttingedge.it/blogs/steven/pivot/entry.php?id=26. - Steven
Bu bir desen mi? hiç duymadım ... en azından bir GoF modeli değil - Thomas Levesque


.Net çerçevesinde uygulanan bazı daha GoF Tasarım Kalıpları:

Cephe - Bir alt sistemdeki bir dizi arabirime daha yüksek düzeyde arabirim

MessageBox (System.Windows.Forms) - Windows Forms arabirimlerinin bazılarına yeniden kullanılabilir bir üst düzey arabirim sağlar; MessageBox.Show("Hello world");.

Bu aynı zamanda C # tasarım desenleri Steven John Metsker tarafından:

MessageBox sınıfı, FCL'deki bir cephenin birkaç örneğinden biridir. Üretime değer, yapılandırılabilir ve yeniden kullanım için tasarlandı. Her şeyden önce MessageBox sınıfı, diyalogları görüntülemeyi kolaylaştıran basit bir arayüz sağlayarak FACADE deseninin amacını karşılar.

Daha fazla bilgi edinmek istiyorsanız MessageBox için kaynak kodu

sineksiklet - Çok sayıda ince taneli nesneyi etkili bir şekilde desteklemek için paylaşımı kullanın.

.Net framework, aynı dizelerde bellek kaydetmek için String Interning kullanır, bu Flyweight deseninin bir uygulamasıdır. Bu video Curtis Lassam, String Interning'i açıklamak için harika bir iş çıkarır.

String Stringing'i arayarak da zorlayabilirsiniz String.Intern("Hello world");.


0
2017-12-27 11:48