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).
Este patrón se define como un patrón de tipo relacional de uno a muchos.
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.
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
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
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
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