¿Cuáles son algunos ejemplos de la vida real de patrones de diseño utilizados en software? [cerrado]

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Estoy leyendo detenidamente los patrones de diseño en este momento y, si bien el libro es excelente, también me gustaría ver cómo se usan realmente en el mundo real.

Si conoce un buen ejemplo de uso de patrones de diseño (preferiblemente en un programa OSS para que podamos echarle un vistazo :), indíquelo a continuación.

¿Fue útil?

Solución

Un momento decisivo para mí en relación con el patrón del observador fue darme cuenta de lo estrechamente asociado que está con los acontecimientos.Considere un programa de Windows que necesita lograr comunicaciones flexibles entre dos formularios.Esto se puede lograr fácilmente con el patrón de observador.

El siguiente código muestra cómo Form2 activa un evento y cualquier otra clase registrada como observador obtiene sus datos.

Vea este enlace para obtener un excelente recurso de patrones:http://sourcemaking.com/design-patterns-and-tips

Código de 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 );            
        }
    }
}

código de 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;
        }
    }
}

Otros consejos

Utilizo la vista pasiva, una versión de la Presentador de vista de modelo patrón, con cualquier formulario web como desarrollo (.NET) para aumentar la capacidad de prueba/mantenimiento/etc.

Por ejemplo, su archivo de código subyacente podría verse así

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

Este código subyacente actúa como una vista muy delgada con lógica cero.En cambio, esta lógica se introduce en una clase de presentador que se puede probar por unidad.

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

Utilice code.google.com

Por ejemplo el resultado de búsqueda para "Fábrica" ​​obtendrá muchos casos en los que se implementa el patrón de fábrica.

El Cadena de Responsabilidad El patrón se implementa en el manejo de eventos DOM.Por ejemplo, (y simplificando un poco) cuando se hace clic en un elemento, ese elemento tiene la primera oportunidad de manejar el evento, y luego cada ancestro en tern hasta el nivel superior. documento se alcanza o uno de ellos detiene explícitamente el evento "burbujeando" más.

C#, Java y Python tienen una implementación estándar del patrón Iterator.En C# y Python, esto se ha integrado en el lenguaje, por lo que puede usar declaraciones de rendimiento y retorno.

El patrón de plantilla se usa comúnmente en la implementación de eventos dotnet para configurar condiciones previas y responder a condiciones posteriores.El caso degenerado es

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

en el que se comprueba la condición previa.En este caso, la condición previa es que los controladores sólo puedan invocarse cuando al menos uno haya sido vinculado.(Por favor, no me digan que debo invocar a los controladores de forma asincrónica.Yo sé eso.Estoy ilustrando un patrón de plantilla, no una técnica de programación asincrónica).

Una condición previa más elaborada podría implicar verificar una propiedad que gobierna la activación de eventos.

El patrón de plantilla también se usa comúnmente para implementar ganchos, por ejemplo

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
}

Si está familiarizado con Python, consulte el marco Twisted.http://twistedmatrix.com/trac/

Quizás un buen ejemplo, como se señala en el Primero los patrones de diseño también es el API de oscilación JAVA que implementa el Observador patrón.Más específicamente, JButton (o la superclase AbstractButton) es la clase Observable y proporciona métodos para agregar y eliminar "Observadores" u "Oyentes", como se les llama en Swing.

El compuesto se utiliza ampliamente en la interfaz de usuario.Los componentes pueden ser componentes de hojas, p.botones y etiquetas o compuestos, p.e.paneles, que pueden contener otros componentes laminares o compuestos.Desde el punto de vista del cliente, todos los componentes se tratan de la misma manera, lo que simplifica enormemente el código del cliente.

El patrón Comando se utiliza en todos los lugares donde se tiene la función Deshacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top