Was sind einige Beispiele aus dem wirklichen Leben für Entwurfsmuster, die in Software verwendet werden? [geschlossen]
-
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.
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.