Quali sono alcuni esempi di vita reale di Design Pattern utilizzati nel software [chiuso]
-
09-06-2019 - |
Domanda
Al momento sto leggendo a capofitto i modelli di progettazione e, sebbene il libro sia eccellente, mi piacerebbe anche vedere come questi vengono effettivamente utilizzati nel mondo reale.
Se conosci un buon esempio di utilizzo del design pattern (preferibilmente in un programma OSS in modo che possiamo dare un'occhiata :), elencalo di seguito.
Soluzione
Un momento ah-ha per me per lo schema dell'osservatore è stato quello di realizzare quanto sia strettamente associato agli eventi.Considera un programma Windows che deve raggiungere liberamente le comunicazioni tra due moduli.Ciò può essere facilmente realizzato con il modello dell’osservatore.
Il codice seguente mostra come Form2 attiva un evento e qualsiasi altra classe registrata come osservatore ottiene i suoi dati.
Vedi questo collegamento per un'ottima risorsa di modelli:http://sourcemaking.com/design-patterns-and-tips
Codice del 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 );
}
}
}
Il codice di Form2
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;
}
}
}
Altri suggerimenti
Utilizzo la visualizzazione passiva, un sapore di Presentatore vista modello modello, con qualsiasi modulo Web come sviluppo (.NET) per aumentare testabilità/manutenibilità/ecc
Ad esempio, il tuo file code-behind potrebbe assomigliare a questo
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
Questo codice dietro agisce come una visione molto sottile con logica zero.Questa logica viene invece inserita in una classe presentatore che può essere testata unitariamente.
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
Utilizza code.google.com
Ad esempio il risultato della ricerca per "Factory" ti porterà molti casi in cui è implementato il pattern factory.
IL Catena di responsabilità pattern è implementato nella gestione degli eventi DOM.Ad esempio, (e semplificando leggermente) quando si fa clic su un elemento, quell'elemento ottiene la prima opportunità di gestire l'evento, quindi ogni antenato in terna fino al livello più alto documento viene raggiunto o uno di essi interrompe esplicitamente il "gorgogliamento" dell'evento.
C#, Java e Python hanno un'implementazione standard del modello Iterator.In C# e Python questo è stato integrato nel linguaggio in modo da poter utilizzare semplicemente le istruzioni yield return.
Il modello di modello viene comunemente usato nell'implementazione di eventi dotnet per impostare precondizioni e rispondere a postcondizioni.Il caso degenerato è
void FireMyEvent(object sender, EventArgs e)
{
if (_myevent != null) _myEvent(sender, e);
}
in cui viene verificata la precondizione.In questo caso la precondizione è che i gestori possano essere invocati solo quando almeno uno è stato associato.(Per favore, non dirmi che dovrei invocare i gestori in modo asincrono.So che.Sto illustrando il modello del modello, non la tecnica di programmazione asincrona.)
Una precondizione più elaborata potrebbe comportare la verifica di una proprietà che governa l'attivazione degli eventi.
Il modello modello viene comunemente utilizzato anche per implementare gli hook, ad esempio
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
}
Se hai familiarità con Python, dai un'occhiata al framework Twisted.http://twistedmatrix.com/trac/
Forse un buon esempio, come sottolineato nel Testare i modelli di progettazione anche il API Java Swing che implementa il Osservatore modello.Più specificamente, JButton (o la superclasse AbstractButton) è la classe Observable e fornisce metodi per aggiungere e rimuovere "Observers", o "Listeners" come vengono chiamati in Swing.
Il composito è ampiamente utilizzato nell'interfaccia utente.I componenti possono essere componenti foglia, ad es.bottoni ed etichette o materiali compositi, ad es.pannelli, che possono contenere altri componenti fogliari o compositi.Dal punto di vista del client, tutti i componenti vengono trattati allo stesso modo, il che semplifica notevolmente il codice client.
Il modello Comando viene utilizzato ovunque sia disponibile la funzionalità Annulla.