观察者模式实例解析

观察者模式实例分析

  1. 观察者模式介绍

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

 

  1. 观察者模式应用场景

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

  1. 观察者模式UML图

 

  1. 观察者模式应用实例

项目链接: 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.本实验观察者模式优缺点

优点:

1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。

       2)支持广播通讯

缺点:

       观察者模式可以知道观察者所关注的对象发生了变化,但是并不知道对象是怎么发生变化的

 

posted @ 2018-10-25 20:12  随时随客  阅读(662)  评论(0编辑  收藏  举报