Was sind einige Beispiele aus dem wirklichen Leben für Entwurfsmuster, die in Software verwendet werden? [geschlossen]

StackOverflow https://stackoverflow.com/questions/36129

  •  09-06-2019
  •  | 
  •  

Frage

Ich lese gerade Entwurfsmuster kopfüber durch und obwohl das Buch ausgezeichnet ist, würde ich auch gerne sehen, wie diese tatsächlich in der realen Welt verwendet werden.

Wenn Sie ein gutes Beispiel für die Verwendung von Designmustern kennen (vorzugsweise in einem OSS-Programm, damit wir es uns ansehen können :), dann listen Sie es bitte unten auf.

War es hilfreich?

Lösung

Für mich war es ein Aha-Moment für das Beobachtermuster, zu erkennen, wie eng es mit Ereignissen verbunden ist.Stellen Sie sich ein Windows-Programm vor, das eine lose Kommunikation zwischen zwei Formularen herstellen muss.Das lässt sich leicht mit dem Beobachtermuster bewerkstelligen.

Der folgende Code zeigt, wie Form2 ein Ereignis auslöst und jede andere als Beobachter registrierte Klasse ihre Daten erhält.

Unter diesem Link finden Sie eine tolle Musterressource:http://sourcemaking.com/design-patterns-and-tips

Code von Form1:

namespace PublishSubscribe
{
    public partial class Form1 : Form
    {
        Form2 f2 = new Form2();

        public Form1()
        {
            InitializeComponent();

            f2.PublishData += new PublishDataEventHander( DataReceived );
            f2.Show();
        }

        private void DataReceived( object sender, Form2EventArgs e )
        {
            MessageBox.Show( e.OtherData );            
        }
    }
}

Form2-Code

namespace PublishSubscribe
{

    public delegate void PublishDataEventHander( object sender, Form2EventArgs e );

    public partial class Form2 : Form
    {
        public event PublishDataEventHander PublishData;

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click( object sender, EventArgs e )
        {
            PublishData( this, new Form2EventArgs( "data from form2" ) );    
        }
    }

    public class Form2EventArgs : System.EventArgs
    {
        public string OtherData;

        public Form2EventArgs( string OtherData )        
        {
            this.OtherData = OtherData;
        }
    }
}

Andere Tipps

Ich verwende die passive Ansicht, eine Variante davon Modellansicht-Präsentator Muster, mit beliebigen Webformularen wie Entwicklung (.NET), um Testbarkeit/Wartbarkeit usw. zu erhöhen

Ihre Code-Behind-Datei könnte beispielsweise so aussehen

Partial Public Class _Default
    Inherits System.Web.UI.Page
    Implements IProductView

    Private presenter As ProductPresenter

    Protected Overrides Sub OnInit(ByVal e As System.EventArgs)
        MyBase.OnInit(e)
        presenter = New ProductPresenter(Me)
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        presenter.OnViewLoad()
    End Sub

    Private ReadOnly Property PageIsPostBack() As Boolean Implements IProductView.PageIsPostBack
        Get
            Return Page.IsPostBack
        End Get
    End Property

    Public Property Products() As System.Collections.Generic.List(Of Product) Implements Library.IProductView.Products
        Get
            Return DirectCast(gridProducts.DataSource(), List(Of Product))
        End Get
        Set(ByVal value As System.Collections.Generic.List(Of Product))
            gridProducts.DataSource = value
            gridProducts.DataBind()
        End Set
    End Property
End Class

Dieser Code dahinter fungiert als eine sehr dünne Ansicht ohne Logik.Diese Logik wird stattdessen in eine Präsentatorklasse übertragen, die einem Unit-Test unterzogen werden kann.

Public Class ProductPresenter
    Private mView As IProductView
    Private mProductService As IProductService

    Public Sub New(ByVal View As IProductView)
        Me.New(View, New ProductService())
    End Sub

    Public Sub New(ByVal View As IProductView, ByVal ProductService As IProductService)
        mView = View
        mProductService = ProductService
    End Sub

    Public Sub OnViewLoad()
        If mView.PageIsPostBack = False Then
            PopulateProductsList()
        End If
    End Sub

    Public Sub PopulateProductsList()
        Try
            Dim ProductList As List(Of Product) = mProductService.GetProducts()
            mView.Products = ProductList
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
End Class

Verwenden Sie code.google.com

Zum Beispiel die Suchergebnis für „Factory“ erhalten Sie viele Fälle, in denen das Factory-Muster implementiert ist.

Der Verantwortungskette Das Muster ist in der Behandlung von DOM-Ereignissen implementiert.Wenn beispielsweise (und etwas vereinfacht) auf ein Element geklickt wird, erhält dieses Element die erste Gelegenheit, das Ereignis zu verarbeiten, und dann alle Vorfahren in der Reihenfolge bis zur obersten Ebene dokumentieren erreicht ist oder einer von ihnen das weitere „Sprudeln“ des Ereignisses explizit stoppt.

C#, Java und Python verfügen über eine Standardimplementierung des Iterator-Musters.In C# und Python wurde dies in die Sprache integriert, sodass Sie einfach yield return-Anweisungen verwenden können.

Vorlagenmuster werden häufig bei der Implementierung von Dotnet-Ereignissen verwendet, um Vorbedingungen einzurichten und auf Nachbedingungen zu reagieren.Der degenerierte Fall ist

void FireMyEvent(object sender, EventArgs e) 
{
  if (_myevent != null) _myEvent(sender, e);
}

in dem die Voraussetzung überprüft wird.Voraussetzung ist in diesem Fall, dass Handler nur dann aufgerufen werden können, wenn mindestens einer gebunden wurde.(Bitte sagen Sie mir nicht, dass ich die Handler asynchron aufrufen soll.Ich weiß, dass.Ich veranschauliche ein Vorlagenmuster, keine asynchrone Programmiertechnik.)

Eine ausgefeiltere Vorbedingung könnte darin bestehen, eine Eigenschaft zu überprüfen, die das Auslösen von Ereignissen regelt.

Vorlagenmuster werden beispielsweise auch häufig zum Implementieren von Hooks verwendet

public virtual void BeforeOpenFile(string filepath)
{
  //stub
}
public virtual void AfterOpenFile(string filepath)
{
  //stub
}
public sealed void OpenFile(string filepath) 
{
  BeforeOpenFile(filepath); //do user customisable pre-open bits
  //do standard bits here
  AfterOpenFile(filepath); //do user customisable post-open bits
}

Wenn Sie mit Python vertraut sind, schauen Sie sich das Twisted-Framework an.http://twistedmatrix.com/trac/

Vielleicht ein gutes Beispiel, wie im Designmuster von Kopf bis Fuß auch, ist das JAVA Swing-API welches das umsetzt Beobachter Muster.Genauer gesagt ist JButton (oder die Superklasse AbstractButton) die Observable-Klasse und stellt Methoden zum Hinzufügen und Entfernen von „Observern“ oder „Listeners“, wie sie in Swing genannt werden, bereit.

Composite wird häufig in der Benutzeroberfläche verwendet.Komponenten können Blattkomponenten sein, z.B.Schaltflächen und Beschriftungen oder Verbundelemente, z.B.Paneele, die andere Blatt- oder Verbundkomponenten enthalten können.Aus Sicht des Clients werden alle Komponenten gleich behandelt, was den Client-Code erheblich vereinfacht.

Das Befehlsmuster wird überall dort verwendet, wo Sie die Rückgängig-Funktionalität haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top