Patrón Observador en .NET - pattern Observer

Descripción general

El patrón Observador (en inglés: Observer) también conocido como "spider" define una dependencia del tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, el observador se encarga de notificar este cambio a todos los otros dependientes. El objetivo de este patrón es desacoplar la clase de los objetos clientes del objeto, aumentando la modularidad del lenguaje, así como evitar bucles de actualización (espera activa o polling).

[TOC] Tabla de Contenidos


↑↑↑

Patrón Observador en .NET - pattern Observer


↑↑↑

Visión general del patrón

Este patrón se define como un patrón de tipo relacional de uno a muchos.

Esquema del patron Observer

Esquema del patron Observer

De esta forma, un subscriptor (también denominado en algunas ocasiones como observador) es el encargado de subscribirse a un publicador.

El publicador es a su vez el encargado de notificar que ha sucedido "algo" que requiere la atención de sus subscritores.

En este punto, el publicador estará relacionado con todos sus subscriptores, y cuando ocurra "algo", todos los subscriptores se darán por enterados.

Lógicamente, debe haber un mecanismo que permita agregar un subscriptor y eliminar al subscriptor, tanto para que reciba notificaciones como para que deje de recibirlas.


↑↑↑

Referencia Bibliografica

Texto e imagen copiados de :

Patrón Observador en .NET - pattern Observer

http://geeks.ms/blogs/jorge/archive/2011/03/29/patr-243-n-observador-en-net-pattern-observer.aspx


↑↑↑

Un Ejemplo del patron

Los Sujetos

La interfaz que tienen que implementar los Sujetos Observados

Public Interface ISujeto
    Sub Registrar(ByVal objObservador As IObservador)
    Sub Desregistrar(ByVal objObservador As IObservador)
    Sub Notificar()
End Interface

↑↑↑

Codigo que implementan los Sujetos Observados

Public Class FormSujetoInterfaces
    Implements ISujeto

    Private _listaObservadores As List(Of IObservador)

    Public Sub New()
        ' Llamada necesaria para el diseñador.
        InitializeComponent()

        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
        _listaObservadores = New List(Of IObservador)
    End Sub

    Public Sub Desregistrar(ByVal objObservador As IObservador) Implements ISujeto.Desregistrar
        _listaObservadores.Remove(objObservador)
    End Sub

    Public Sub Registrar(ByVal objObservador As IObservador) Implements ISujeto.Registrar
        _listaObservadores.Add(objObservador)
    End Sub

    Public Sub Notificar() Implements ISujeto.Notificar
        If _listaObservadores.Count = 0 Then Exit Sub

        Dim objDatosSujeto As New DatosSujetoObservador
        objDatosSujeto.Mensaje = Me.TextBoxOriginal.Text

        For Each objObservador As IObservador In _listaObservadores
            objObservador.Actualizar(objDatosSujeto)
        Next
    End Sub

    Private Sub ButtonAñadeObservador_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAñadeObservador.Click
        Dim Observador As New FormObservadorInterfaces(Me)
        Observador.Show()
    End Sub

    Private Sub ButtonObservador_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonObservador.Click
        Me.LabelResultado.Text = Me.TextBoxOriginal.Text
        Call Notificar()
    End Sub

    Private Sub ButtonTerminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonTerminar.Click
        Me.Close()
    End Sub

End Class

↑↑↑

Los Observadores

La interfaz que tienen que implementar los observadores

 Public Interface IObservador
     Sub Actualizar(ByVal objDatosObservador As DatosSujetoObservador)
End Interface

↑↑↑

Codigo que implementa un Observador

Public Class FormObservadorInterfaces
    Implements IObservador

    Public Sub Actualizar(ByVal objDatosObservador As DatosSujetoObservador) Implements IObservador.Actualizar
        Me.LabelObservador.Text = objDatosObservador.Mensaje
    End Sub


    ' para registrar este observador en el sujeto
    ' necesitamos la referencia dle sujeto
    ' que se pasara en el constructor
    Private _refISujeto As ISujeto = Nothing


    Public Sub New(ByVal refSujeto As ISujeto)

        ' Llamada necesaria para el diseñador.
        InitializeComponent()

        ' Agregue cualquier inicialización después de la llamada a InitializeComponent().

        _refISujeto = refSujeto
        _refISujeto.Registrar(Me)


    End Sub
End Class

↑↑↑

El Objeto que contiene los datos que envia el sujeto al observador

Public Class DatosSujetoObservador

    Private _mensaje As String
    Public Property Mensaje() As String
        Get
            Return _mensaje
        End Get
        Set(ByVal value As String)
            _mensaje = value
        End Set
    End Property

End Class

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]