观察者模式实例解析

观察者模式实例分析

观察者模式介绍

观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现,这么想来目标发生情况到观察者知道情况,其实是由目标奖情况发送到观察者的。

观察者模式应用场景

当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。

观察者模式UML图

观察者模式应用实例

项目链接: https://github.com/cyy3900/ObserverPattern/tree/master/ObserverPattern

1) 观察者

观察者接口;

Observerl类是是所有观察者的抽象,观察者可以通过具体实现来创建观察者。

package com.cyy.observer;

public interface Subject { //信息发布者

    public void registerObserver(Observer o);//注册监听器

    public void removeObserver(Observer o);//移除监听器

    public void notifyObservers();//发送消息

}

  具体观察者

  CurrentConditionDisplay是具体的观察者,在接口中具体实现天气的更新以及展示。

package com.cyy.observer.impl;

import com.cyy.observer.DisplayElement;

import com.cyy.observer.Observer;

import com.cyy.observer.Subject;

public class CurrentConditionDisplay implements Observer, DisplayElement {

 

    private float temperature;

    private float humidity;

    private float pressure;

    private Subject subject;

   

    public CurrentConditionDisplay(Subject subject) {

        // TODO Auto-generated constructor stub

        this.subject = subject;

        subject.registerObserver(this);

    }

   

    @Override

    public void display() {

        // TODO Auto-generated method stub

        System.out.println("Current Conditions:" + temperature + ":" + humidity +"" + pressure);

    }

 

    @Override

    public void update(float temperature, float humidity, float pressure) {

        // TODO Auto-generated method stub

        this.temperature = temperature;

        this.humidity = humidity;

        this.pressure = pressure;

        display();

    }

 

}

2) 被观察者

主题接口subject:定义了注册添加、删除观察者以及发送通知的方法

package com.cyy.observer;

public interface Subject { //信息发布者

    public void registerObserver(Observer o);//注册监听器

    public void removeObserver(Observer o);//移除监听器

    public void notifyObservers();//发送消息

}

  具体类WeatherData:具体实现了添加和删除观察者的方法,并能在数据更新时向观察者发送通知

package com.cyy.observer.impl;

 

import java.util.ArrayList;

 

import com.cyy.observer.Observer;

import com.cyy.observer.Subject;

public class WeatherData implements Subject {

 

    private float temperature;

    private float humidity;

    private float pressure;

   

    private ArrayList<Observer> observers;

   

    public WeatherData() {

        // TODO Auto-generated constructor stub

        observers = new ArrayList<Observer>();

    }

   

    @Override

    public void registerObserver(Observer o) {

        // TODO Auto-generated method stub

        observers.add(o);

    }

 

    @Override

    public void removeObserver(Observer o) {

        // TODO Auto-generated method stub

        observers.remove(o);

    }

 

    @Override

    public void notifyObservers() {

        // TODO Auto-generated method stub 

        for (Observer observer : observers) {

            observer.update(temperature, humidity, pressure);

        }

    }

 

    public void setMeasurements(float temperature,float humidity,float pressure){

        this.temperature = temperature;

        this.humidity = humidity;

        this.pressure = pressure;

        notifyObservers();

    }

}

 

5.本实验观察者模式优缺点

优点:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzypdx.html