"Head First Design Patterns" notas de estudio - de modo de observador

El segundo observador modo de escritura, es el segundo capítulo del libro, cuando se trata de este modo observador, la impresión es bastante profunda, porque el año pasado el diseñador de software de prueba blanda última pregunta, ¿es este el modo de prueba observador.

concepto

modelo observador define las dependencias entre muchos objetos, de manera que, cuando un objeto cambia de estado, todos sus dependientes será notificado y se actualiza automáticamente.

Ejemplo muestra

Necesidad de hacer un sistema que consta de tres partes, estaciones meteorológicas (adquisición de datos meteorológicos del dispositivo físico real), el objeto de la WeatherData (seguimiento de datos de las estaciones meteorológicas, y actualiza los tablones de anuncios) y el tablón de anuncios (visualizar las condiciones meteorológicas actuales para el usuario para ver) .

En este ejemplo, el objeto físico WeatherData sabe cómo ponerse en contacto con las estaciones climáticas, a fin de obtener datos actualizados. WeatherData objeto también actualizar la visualización de tres vallas publicitarias: la situación actual (temperatura, humedad, presión atmosférica), estadísticas meteorológicas y las previsiones meteorológicas.

Nuestro objetivo es construir una aplicación que utiliza los datos adquiridos objeto WeatherData, y luego actualizar los tres tablones de anuncios.

El método comprende la siguiente clase de WeatherData.

getTemplate()
getHumidity()
getPressure()
measuermentsChanged()

Debemos darnos cuenta de measurementChanged método ()

  • Cuando los nuevos datos de medición está listo, se llama a este método
  • WeatherData cuando los nuevos datos de medición, tres vallas publicitarias deben actualizarse de inmediato
  • Este sistema debe ser escalable, de modo que otros desarrolladores a tablón de anuncios de generación personalizada, los usuarios pueden añadir o eliminar cualquier tablón de anuncios, los tres tablón de anuncios existente, la situación actual, las estadísticas meteorológicas y tablón de anuncios el pronóstico del tiempo.

Modelo de error

En primer lugar, para demostrar un error ah

public class WeatherData {
    /**
     * 目前状况布告板
     */
    CurrentConditionDisplay currentConditionDisplay;
    /**
     * 气象统计布告板
     */
    ForecastDisplay forecastDisplay;
    /**
     * 天气预报布告板
     */
    StatisticsDisplay statisticsDisplay;
    float temperature;
    float humidity;
    float pressure;

    public float getHumidity() {
        return humidity;
    }

    public float getPressure() {
        return pressure;
    }

    public float getTemperature() {
        return temperature;
    }

    public void measurementsChanged() {
        float temperature = getTemperature();
        float humidity = getHumidity();
        float pressure = getPressure();

        currentConditionDisplay.update(temperature, humidity, pressure);
        statisticsDisplay.update(temperature, humidity, pressure);
        forecastDisplay.update(temperature, humidity, pressure);
    }
}

La clase que declara unos cuantos ejemplo, y luego actualizar el tablón de anuncios en el método measurementsChanged (), el Cuando los datos se ha actualizado, llama a este método para actualizar el tablón de anuncios.

Sin embargo, las deficiencias de este enfoque general, que está programado para lograr aumento específico en el futuro cuando se quita o modifica el tablón de anuncios del programa imprescindible. Así que esto definitivamente no ha sido diseñado con muy intensivos en recursos, y la necesidad de modificar el código en varias ocasiones.

modificación

Ahora podemos hablar con el tema, "el modo de observador = + tema de observador", entonces ¿cuál es el tema, lo que es el observador?

Tema, son los datos de gestión de objetos, lo que equivale al centro de monitoreo, cuando hay un cambio de los datos, la primera vez que un tema objeto informará al objeto visor.

objeto observador se ha registrado a un tema, cuando hay un cambio de datos, los datos se recibirán objeto de cambios. Es similar a la relación entre la prensa y los lectores, cuando existe la necesidad de nuevas noticias publicadas, el periódico diario impreso, entregado en manos de los lectores. Se trata de uno a muchos, cuando se cambia un objeto, otros dependientes son notificados.

Principios de diseño: Para el diseño de la interacción de acoplamiento flexible entre los objetos y el trabajo.

Para los objetos de observación, los da cuenta espectador sólo conocen el tema de una interfaz (Observador Interface), el sujeto no necesita saber quién es el observador es una clase concreta, hecho, o cualquier otro detalle. Y el espectador puede aumentar o disminuir de manera arbitraria, pero no se verá afectado. Cuando hay un nuevo observador, código sujeto sin modificaciones, lo que necesita hacer es poner en práctica esta interfaces de observadores en la nueva clase, y luego registrada como observador.

El patrón de observador es dejar que el sujeto y el observador débilmente acoplados, pueden interactuar entre sí, pero no se conocen los detalles. El cambio, ya sea entre los dos, no afectará a la otra, ya que los dos están débilmente acoplados, siempre y cuando todavía se observa la interfaz entre ellos, somos libres para cambiarlos.

Luego, busquen en el código de barras específico.

ejemplo de implementación de código

En primer lugar tres interfaces, a saber DisplayElement, Observador y Asunto tres interfaces, como su nombre lo indica, una primera interfaz de pantalla para el tablón de anuncios, la segunda interfaz es una interfaz de espectador a la actualización de datos, la tercera interfaz es una interfaz de tema para el registro de observadores.

public interface DisplayElement {
    public void display();
}

public interface Observer {
    public void update(float temp, float humidity, float pressure);
}

public interface Subject {
    public void registerObserver(Observer observer);
}

A continuación mencionamos antes, la clase WeatherData, debido a la necesidad de informar a las actualizaciones de los datos de observación, por lo que es un tema, es necesario implementar la interfaz Asunto contiene una colección de observador.

public class WeatherData implements Subject {
    private ArrayList observers;
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        int i = observers.indexOf(observer);
        if (i >= 0) {
            observers.remove(observer);
        }
    }

    public void notifyObservers() {
        for (int i = 0; i < observers.size(); i++) {
            Observer observer = (Observer) observers.get(i);
            observer.update(temperature, humidity, pressure);
        }
    }

    public void measurementsChanged() {
        notifyObservers();
    }

    public void setMeasurements(float temperature, float humidity, float pressure) {
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }
}

es una colección de los observadores de observación, mientras que al mismo tiempo la construcción de objetos Tiempo instancia un conjunto vacío, que se utiliza para hacer que el observador registra un objeto contenedor, las tres propiedades restantes se requieren atributos letrero.

método registerObserver (Observador Observador) es un método para registrar un observador, removeObserver empatía (Observador Observador) es quitar el método de observador.

los notifyObservers () método es para notificar al espectador a través de la recogida de actualizaciones de datos, measurementsChanged () es para actualizar los datos en los métodos mencionados anteriormente.

setMeasurements (temperatura flotador, humedad flotador, presión float) (temperatura flotador, humedad flotador, presión float) es para ajustar los tres atributos de método, mientras que llama measurementsChanged () método actualiza el tablón de anuncios de datos.

Luego está la clase CurrentConditionsDisplay tablón de anuncios. Implementa la interfaz observador y una interfaz de aplicación contiene un objeto de tema, ejemplo inicializado cuando los objetos tienen que pasar el registro tema, dos métodos de interfaz para lograr.

public class CurrentConditionsDisplay implements Observer, DisplayElement {
    private float temperature;
    private float humidity;
    private Subject weatherData;

    public CurrentConditionsDisplay(Subject weatherData) {
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }

    @Override
    public void display() {
        System.out.println("Current conditions: " + temperature +
                "F degrees and " + humidity + "% humidity");
    }

    @Override
    public void update(float temp, float humidity, float pressure) {
        this.temperature = temp;
        this.humidity = humidity;
        display();
    }
}

Por último, la clase de prueba.

public class WeatherStation {
    public static void main(String[] args) {
        WeatherData weatherData = new WeatherData();

        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
        weatherData.setMeasurements(80,65, 30.4f);
    }
}

Creación de un objeto de tema, la creación de un objeto tablón de anuncios es actualizada por los objetos de datos del sujeto, imprime el tablón de anuncios de datos para mostrar la consola.

Esta no es una configuración de claro-a-muchos, hay un conjunto de uno, uno de una pluralidad de objetos. Cuando las necesidades de actualización de los datos, llame al método de una serie de acciones, que será después de las dos débilmente acoplados, que desea añadir un nuevo tablón de anuncios sólo es necesario crear una nueva clase que implementa la interfaz de observador, entonces el objeto se pueden registrar en el tema.

Los patrones de diseño próximos continúan mañana.

Publicado 26 artículos originales · ganado elogios 2 · Vistas 2331

Supongo que te gusta

Origin blog.csdn.net/qq_42909545/article/details/104781334
Recomendado
Clasificación