2008-08-30 22 views

Respuesta

3

Un momento ah-ha para mí para el patrón del observador era darse cuenta de lo estrechamente relacionado que está con los eventos. Considere un programa de Windows que necesita lograr comunicaciones sueltas entre dos formularios. Eso se puede lograr fácilmente con el patrón del observador.

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

ver este vínculo para un gran recurso patrones: http://sourcemaking.com/design-patterns-and-tips

de código de Form1: Código

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);    
     } 
    } 
} 

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; 
     } 
    } 
} 
+0

¿dónde se escribe el evento PublishData? –

+0

Me refiero a PublishDataEventHander, ¿qué debería pasar en ese evento donde está escrito? –

3

utilizo vista pasivo, un sabor del patrón Model View Presenter, con cualquier formulario web como desarrollo (.NET) para aumentar la capacidad de prueba/mantenimiento/etc.

Por ejemplo, el archivo de código subyacente podría ser algo como esto

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 detrás está actuando como un punto de vista muy delgado, con cero lógico. En cambio, esta lógica se introduce en una clase de presentador que se puede probar en unidades.

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 
3

Uso code.google.com

Por ejemplo, la search result de "fábrica" ​​te llevará a una gran cantidad de casos en los que se implementa el patrón de fábrica.

3

El patrón Cadena de responsabilidad 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 hasta que se alcanza el nivel superior documento o uno de ellos detiene el evento explícitamente " burbujeando "más allá.

1

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

0

Composite se usa ampliamente en la interfaz de usuario. Los componentes pueden ser componentes de hoja, p. botones y etiquetas o materiales compuestos, p. ej. paneles, que pueden contener otros componentes de hoja o compuestos. Desde el punto de vista del cliente, todos los componentes son tratados de la misma manera, lo que simplifica enormemente el código del cliente.

0

El patrón de plantilla se utiliza comúnmente en la implementación de eventos dotnet para establecer precondiciones y responder a las postcondiciones.El caso degenerado es

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

en el que se verifica la condición previa. En este caso, la condición previa es que los manipuladores solo se puedan invocar cuando se haya vinculado al menos uno. (Por favor, no me diga que debo invocar a los manipuladores de forma asíncrona. Lo sé. Yo ilustro Modelo del modelo, no la técnica de programación asíncrona.)

Una condición previa más elaborado podría implicar la comprobación de una propiedad que gobierna el disparo de eventos.

Modelo del modelo también se utiliza comúnmente para implementar enlaces, 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 
} 
0

El patrón de comando se utiliza en todas partes usted tiene funcionalidad de deshacer.

1

Tal vez un buen ejemplo, como se ha señalado en el Head First Design Patterns también, es la oscilación JAVA API que implementa el Observador patrón. Más específicamente, el JButton (o la superclase AbstractButton) es la clase Observable y proporciona métodos para agregar y eliminar "Observadores" u "Oyentes" como se llaman en Swing.

Cuestiones relacionadas