tectijuana / pdd6a-archivado

Patrones de diseño
GNU Affero General Public License v3.0
6 stars 2 forks source link

Observer #25

Closed aimee1293 closed 8 years ago

aimee1293 commented 8 years ago

Observer

Este patrón de diseño permite reaccionar a ciertas clases llamadas observadores sobre un evento determinado. Es usado en programación para monitorear el estado de un objeto en un programa. Está relacionado con el principio de invocación implícita. La motivación principal de este patrón es su utilización como un sistema de detección de eventos en tiempo de ejecución. Es una característica muy interesante en términos del desarrollo de aplicaciones en tiempo real.

Se debe utilizar:

Subject: conoce a sus observadores y ofrece la posibilidad de añadir y eliminar observadores. Posee un método llamado attach() y otro detach() que sirven para agregar o remover observadores en tiempo de ejecución.

Observer: define la interfaz que sirve para notificar a los observadores los cambios realizados en el Subject.

SubjectConcreto: almacena el estado que es objeto de interés de los observadores y envía un mensaje a sus observadores cuando su estado cambia.

ObserverConcreto: mantiene una referencia a un SubjectConcreto. Almacena el estado del Subject que le resulta de interés. Implementa la interfaz de actualización de Observer para mantener la consistencia entre los dos estados.

Cibergrafia: http://migranitodejava.blogspot.mx/2011/06/observer.html

aimee1293 commented 8 years ago

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;

namespace Observer { //El código fuente de la interfaz Observer es muy simple puesto que sólo contiene la firma del método actualiza public interface Observer { void actualiza(); } }

{ //Los observadores se gestionan mediante una lista public abstract class Sujeto { protected IList observadores = new List();

    public void agrega (Observer observador)
    {
        observadores.Add(observador);
    }

    public void suprime(Observer observador)
    {
        observadores.Remove(observador);
    }

    public void notifica()
    {
        foreach (Observer observador in observadores)
            observador.actualiza();
    }
}

}

{ //Incluye la clase del programa principal. Este programa crea un //vehículo y a continuación una vista a la que pide la visualización. //Se modifica el precio y la vista se refresca. //Se crea una segunda vista que se asocia al mismo vehículo. //El precio se modificaa de nuevo y ambas vistas se refrescan.

public class Usuario
{
    static void Main(string[] args)
    {
        Vehiculo vehiculo = new Vehiculo();
        vehiculo.descripcion = "Vehiculo económico";
        vehiculo.precio = 50000;
        VistaVehiculo vistaVehiculo = new VistaVehiculo(vehiculo);
        vistaVehiculo.redibuja();
        vehiculo.precio = 4500.0;
        VistaVehiculo vistaVehiculo2 = new VistaVehiculo(vehiculo);
        vehiculo.precio = 5500.0;
        Console.Read();
    }
}

}

{ //El código fuente de la clase Vehiculo aparece a continuación. //Contiene dos atributos y los accesos de lectura y escritura para ambos atributos. //Los dos accesos de escritura invocan al método notifica.

public class Vehiculo : Sujeto
{
    protected string _descripcion;
    protected double _precio;

    public string descripcion
    {
        get
        {
            return _descripcion;
        }
        set
        {
            _descripcion = value;
            this.notifica();
        }
    }

        public double precio
        {
            get
            {
                return _precio;
            }
            set 
            {
                _precio = value;
                this.notifica();
            }
        }

    }
}

{ //La clase VistaVehiculo gestiona un texto que contiene la descripción y el //precio del vehículo asociado (el sujeto). Este texto se actualiza //tras cada notificación en el cuerpo del método actualiza. //El méodo redibuja imprime este texto por pantalla.

public class VistaVehiculo : Observer
{
    protected Vehiculo vehiculo;
    protected string texto = "";

    public VistaVehiculo (Vehiculo vehiculo)
    {
        this.vehiculo = vehiculo;
        vehiculo.agrega(this);
        actualizarTexto();
    }

    protected void actualizarTexto()
    {
        texto = "Descripcion " + vehiculo.descripcion + " Precio: " + vehiculo.precio;
    }

    public void actualiza()
    {
        actualizarTexto();
        this.redibuja();
    }

    public void redibuja()
    {
        Console.WriteLine(texto);
    }
}

}

aimee1293 commented 8 years ago

1

IoTeacher commented 8 years ago

@aimee1293 con 100, en CSharp