Quali sono alcuni esempi di vita reale di Design Pattern utilizzati nel software [chiuso]

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

  •  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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top