¿Cuáles son algunos ejemplos de la vida real de patrones de diseño utilizados en software? [cerrado]
-
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.
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.