Patrón de diseño (20) Patrón de comportamiento-Patrón de observador

Prólogo

Saber algo nuevo

Primero revise los patrones de comportamiento aprendidos anteriormente:

  • Patrón de método de plantilla: defina el esqueleto del algoritmo y el proceso en la clase principal, algunos pasos específicos se retrasan hasta que se implemente la subclase, y el usuario puede reutilizar la plantilla de clase principal (flujo de invitado: orden- "comer-" pago, específico de lo que come la subclase Decisión)
  • Modo de comando: encapsule comandos en objetos, agregue ejecutores de comando, los solicitantes de comando solo necesitan llamar a los objetos de comando para completar la ejecución del comando, desacoplar completamente los solicitantes de comando y los ejecutores de comando (los botones del control remoto son objetos de comando, Presione el botón en el control remoto para cambiar las luces)
  • Patrón de visitante: aísle las operaciones impuestas a los objetos de elemento de una estructura de objeto y encapsúlelos como visitantes. Los visitantes no cambiarán la estructura del objeto cuando cambien (las compras en centros comerciales, los carritos de compras almacenan varios objetos básicos, los clientes pueden ver las compras La calidad de los productos en el automóvil, el cajero puede verificar el precio de los productos en el carrito de compras)
  • Modo iterador: separe la función del objeto de almacenamiento de la función del objeto transversal en el objeto de agregación, encapsule la función del objeto transversal en un iterador, puede usar el iterador correspondiente para diferentes objetos agregados o reemplazar diferentes iteradores (catálogo de Linux a iterador Directorio de jerarquía de descripción de camino)

A continuación, complete el aprendizaje en modo observador


Problemas en la realidad

Sabemos que los patrones de comportamiento describen el comportamiento colaborativo entre objetos o clases.

En la vida real, varios objetos están relacionados entre sí. Un cambio en un objeto causará un cambio en otro objeto. Al conducir, encontrará semáforos, luces rojas paradas y luces verdes; La información meteorológica en nuestros teléfonos móviles también debe corresponder con los datos meteorológicos de la Oficina de Respiración

Inserte la descripción de la imagen aquí

Los datos meteorológicos de la Oficina Meteorológica cambian, y los datos en la aplicación también deben cambiar. Esta es la idea del modelo de observador.


Modo observador

¿Qué es el modo observador?

Patrón de observador : defina una relación de dependencia de uno a muchos entre objetos, de modo que cada vez que cambie el estado de un objeto, sus objetos dependientes relacionados sean notificados y actualizados automáticamente. El modo de observador también se denomina modo Publicar / Suscribir (Publicar / Suscribir) , modo Vista de modelo (Modelo / Vista), modo de escucha de origen (fuente / escucha) o modo de dependientes . El patrón de observador es un patrón de comportamiento del objeto.

¿Por qué el modo observador?

La existencia de dependencias entre objetos, queremos notificarnos automáticamente si el objetivo de observación cambia, en lugar de ver si el objetivo de observación ha cambiado

Por ejemplo: los datos meteorológicos de la Oficina Meteorológica cambian, esperamos que la Oficina Meteorológica envíe los datos automáticamente a nuestra APLICACIÓN, en lugar de ir a verificar los datos meteorológicos de la Oficina Meteorológica

El objeto que cambia se llama objetivo de observación, y el objeto notificado se llama observador. Un objetivo de observación puede corresponder a múltiples observadores, y no existe una conexión mutua entre estos observadores. Puede agregar y eliminar observadores según sea necesario para hacer el sistema Más fácil de expandir

Establezca una relación de dependencia entre objetos y objetos, cuando un objeto cambia, notificará automáticamente a otros objetos y otros objetos responderán en consecuencia

Estructura de patrón de observador

Inserte la descripción de la imagen aquí

Rol de modo:

  • Función de sujeto abstracto (Asunto): también llamada clase objetivo abstracta, proporciona una clase de agregación para guardar objetos de observador y métodos para agregar y eliminar objetos de observador, y un método abstracto para notificar a todos los observadores

  • Función de sujeto concreto (sujeto concreto): también llamada clase objetivo concreta, que implementa el método de notificación en el objetivo abstracto y notifica a todos los objetos observadores registrados cuando cambia el estado interno del sujeto concreto

  • Rol de observador abstracto (observador): es una clase o interfaz abstracta, contiene un método abstracto para actualizarse y se llama al recibir una notificación de cambio de un tema específico

  • Rol Observador concreto: implementa el método abstracto definido en el observador abstracto para actualizar su estado cuando se le notifican los cambios en el objetivo


Caso de realización del patrón

Para la información meteorológica de la Administración Meteorológica, hay: temperatura, presión, humedad.

Hay dos sitios web registrados en la oficina meteorológica: la oficina meteorológica actualizará la información meteorológica del sitio web cada vez que se actualice la información.

Inserte la descripción de la imagen aquí

package com.company.Behavioral.observer;

import java.util.ArrayList;

//抽象观察者
interface Observer{
    public void update(float temperature,float pressure,float humidity);
}
//具体观察者:QQ
class QQ implements Observer{
    private float temperature;
    private float pressure;
    private float humidity;
    //更新信息
    @Override
    public void update(float temperature, float pressure, float humidity) {
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        display();
    }
    //展示天气信息
    private void display(){
        System.out.println("****Today: temperature ="+ temperature + "****");
        System.out.println("****Today: pressure ="+ pressure + "****");
        System.out.println("****Today: humidity ="+ humidity + "****");
    }
}
//具体观察者:baidu
class Baidu implements Observer{
    private float temperature;
    private float pressure;
    private float humidity;

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

    private void display(){
        System.out.println("****百度网站气温: temperature ="+ temperature + "****");
        System.out.println("****百度网站气压: pressure ="+ pressure + "****");
        System.out.println("****百度网站湿度: humidity ="+ humidity + "****");
    }
}

//接口,由子类实现
interface Subject {
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();
}

class WeatherData implements Subject{
    private float temperature;
    private float pressure;
    private float humidity;
    //观察者集合
    private ArrayList<Observer> observers;

    public WeatherData() {
        this.observers = new ArrayList<Observer>();
    }
    //注册一个观察者
    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }
    //删除一个观察者
    @Override
    public void removeObserver(Observer o) {
        if (observers.contains(o)) {
            observers.remove(o);
        }
    }
    //遍历所有观察者,并通知
    @Override
    public void notifyObserver() {
        for (int i = 0 ; i < observers.size() ; i++){
            observers.get(i).update(this.temperature,this.pressure,this.humidity);
        }
    }
    //数据改变时,通知所有观察者
    public void dataChange(){
        notifyObserver();
    }
    //数据改变接口
    public void setData(float temperature, float pressure, float humidity){
        this.temperature = temperature;
        this.pressure = pressure;
        this.humidity = humidity;
        dataChange();
    }
}
class Client{
    public static void main(String[] args) {
        //创建一个WeatherData
        WeatherData weatherData = new WeatherData();
        //创建观察者
        QQ qq = new QQ();
        Baidu baidu = new Baidu();
        //注册
        weatherData.registerObserver(qq);
        weatherData.registerObserver(baidu);
        //数据改变
        System.out.println("通知各个观察者");
        weatherData.setData(10,100,30);
    }
}

Inserte la descripción de la imagen aquí

Cada vez que el cambio de datos de la Administración Meteorológica atraviese automáticamente el Observador registrado en WeatherData, actualice los datos del Observador


Ventajas y desventajas del modo

Se ha utilizado el modo observador, en el proceso de uso, puede analizar y pensar en las ventajas y desventajas del modo observador

Ventaja

  • El patrón de observador puede realizar la separación de la capa de presentación y la capa de lógica de datos , y define un mecanismo estable de entrega de actualización de mensajes, abstrayendo la interfaz de actualización, de modo que puede haber una variedad de diferentes capas de presentación como roles de observador específicos (el denominado patrón MVC Según la idea del patrón de observación, los datos cambian la capa de presentación del Modelo y cambian en consecuencia)
  • El patrón de observador establece un acoplamiento abstracto entre el objetivo de observación y el observador.
  • El modo observador admite la comunicación de difusión
  • El modo observador cumple los requisitos del "principio de apertura y cierre"

Desventajas

  • Si un objetivo de observación tiene muchos observadores directos e indirectos , tomará mucho tiempo notificar a todos los observadores
  • Si existe una dependencia circular entre el observador y el objetivo de observación , el objetivo de observación activará una llamada circular entre ellos, lo que puede hacer que el sistema se bloquee
  • El modo de observador no tiene un mecanismo correspondiente para que el observador sepa cómo ha cambiado el objeto objetivo observado, pero solo para saber que el objetivo observado ha cambiado

Escena aplicable

  • Un modelo abstracto tiene dos aspectos, uno de los cuales depende del otro . Encapsula estos aspectos en objetos separados para que puedan cambiarse y reutilizarse independientemente
  • El cambio de un objeto hará que cambien también uno o más objetos , sin saber cuántos objetos cambiarán, lo que puede reducir el acoplamiento entre los objetos.
  • Un objeto debe notificar a otros objetos sin saber quiénes son
  • Necesita crear una cadena de disparo en el sistema, el comportamiento del objeto A afectará al objeto B, el comportamiento del objeto B afectará al objeto C ..., puede usar el modo observador para crear un mecanismo de disparo en cadena

Uso real

  1. Oyente en JavaWeb

¿ Realmente puedes entender Listener? -Escucha detallada

Los diversos oyentes en JavaWeb se basan en el modo de observador, que también se puede llamar el modo de oyente

Por ejemplo: ServletContextListener, que escucha la creación y destrucción de los objetos del dominio ServletContext en el servidor, pero un poco diferente es que encapsula el ciclo de vida de ServletContext en un objeto de evento, y el observador recibe el objeto de evento, que puede activar la costumbre del observador. Método

De hecho, en el caso de la Oficina Meteorológica antes que nosotros, también podemos encapsular los datos meteorológicos en un objeto, y el cambio de objeto es un evento

  1. Modo de procesamiento de eventos

En JDK1.1 y versiones posteriores, el modelo de procesamiento de eventos utiliza un modelo de evento de delegación (DEM) basado en el patrón de observador

El editor del evento se denomina fuente del evento (fuente del evento) y el suscriptor se llama escucha del evento (escucha del evento). En este proceso, el objeto del evento (objeto del evento) también se puede utilizar para transferir información relacionada con el
evento. Los objetos de escucha (objetos de procesamiento de eventos) y los objetos de eventos constituyen los tres elementos del modelo de procesamiento de eventos de Java

  1. Patrón MVC

MVC en SpringMVC se refiere al patrón MVC

El patrón MVC es un patrón arquitectónico que incluye tres roles: Modelo, Vista y Controlador . El patrón de observador se puede utilizar para implementar el patrón MVC El objetivo de observación en el patrón de observador es el modelo en el patrón MVC, y el observador es la vista en el MVC. Mediador Cuando los datos de la capa del modelo cambian, la capa de vista cambiará automáticamente su contenido de visualización

SpringMVC es la división de la capa de persistencia de datos, la capa de servicio, la capa de control y la capa de vista. A través del controlador front-end DispatcherServlet, cadena de ejecución de procesamiento HandlerExcutionChian, mapeador de procesador HandlerMapping, adaptador de procesador HandlerAdapter, adaptador de vista ViewResolver y otros componentes Transmisión de datos, desacoplamiento completo

En general, el modo de observador es un modo muy útil, y a menudo se usa


Resumen

  • Modo de observador: defina la relación de dependencia entre los objetos, cuando cambie el estado del objeto de destino, notifique automáticamente a sus objetos dependientes relacionados y actualice automáticamente
  • El patrón de observador tiene cuatro roles: clase objetivo abstracta, clase objetivo concreta, observador abstracto, observador concreto
  • La clase objetivo específica implementa el método abstracto de la clase objetivo abstracta, notificando automáticamente a los observadores registrados cuando cambia su estado; el observador específico implementa el método de observadores abstractos, y actualiza automáticamente su estado cuando la clase objetivo específica notifica
  • Las ventajas del modo de observador: lograr la separación de la capa de presentación y la capa de lógica de datos; apoyar la comunicación de difusión; establecer un acoplamiento abstracto entre el objetivo de observación y el observador
  • Desventajas del modo de observador: cuando hay demasiados observadores, lleva mucho tiempo notificar; si el observador y la clase objetivo tienen dependencias circulares, el sistema fallará
  • El patrón de observador es aplicable: el modelo abstracto tiene una relación de dependencia, y el cambio de un objeto provocará el cambio de otros objetos, sin saber cuántos objetos han cambiado; el sistema necesita una cadena de activación
  • El patrón de observador tiene muchos usos prácticos, como el componente de escucha en JavaWeb, el patrón de procesamiento de eventos en Java y el patrón MVC en Spring MVC utiliza la idea del patrón de observador
Publicado 121 artículos originales · ganó 31 · vistas 7869

Supongo que te gusta

Origin blog.csdn.net/key_768/article/details/105481022
Recomendado
Clasificación