观察者模式在一款简易的天气预报系统中的应用

本文中应用到的github源码地址:https://github.com/Sunshine-lhy/Observer

 一、观察者模式概述

  首先,观察者模式在百度百科上的定义如下:

  观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

 

  阎宏博士的《JAVA与模式》一书中开头是这样描述观察者(Observer)模式的:

  观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

  观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

 

  (1)Subject模块
  Subjec模块有3个主要操作

扫描二维码关注公众号,回复: 3679789 查看本文章

  addObserver():注册添加观察者(申请订阅)
  deleteObserver():删除观察者(取消订阅)
  notifyObserver():主题状态发生变化时通知所有的观察者对象
  (2)Oserver模块
  Oserver模块有1个核心操作update(),当主题Subject状态改变时,将调用每个观察者的update()方法,更新通知。

  (3)UML图

二、代码实例

观察者代码

public class Client {
    
public static void main(String[] args){
//    创建目标
    CreateWeatherSubject weather=new CreateWeatherSubject();
//    创建观察者
    CreateWeatherObserver observerGirl=new CreateWeatherObserver();
    observerGirl.setObserverName("媳妇");
    observerGirl.setRemindThing("我们的第一次约会");
    
    CreateWeatherObserver observerMum=new CreateWeatherObserver();
    observerMum.setObserverName("mama");
    observerMum.setRemindThing("是个购物的好诶子,记得扫货");
//    注册观察者
    weather.attach(observerGirl);
    weather.attach(observerMum);
//    目标
    weather.setWeatherContent("明天天气晴朗,蓝天白云,气温28°");
}
}

Oserver模块 

具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致

public class CreateWeatherObserver implements WeatherObserver{
//观察者的名字
    private String observerName;
    
//天气的内容情况
    private String weatherContent;
        
//被观察者要提醒的内容
    private String remindThing;
    
    public String getObserverName() {
        return observerName;
    }

    public void setObserverName(String observerName) {
        this.observerName = observerName;
    }

    public String getWeatherContent() {
        return weatherContent;
    }

    public void setWeatherContent(String weatherContent) {
        this.weatherContent = weatherContent;
    }

    public String getRemindThing() {
        return remindThing;
    }

    public void setRemindThing(String remindThing) {
        this.remindThing = remindThing;
    }

    @Override
    //获取目标类的状态要同步到观察者的状态中
    public void update(WeatherSubject subject) {
        // TODO Auto-generated method stub
        weatherContent=((CreateWeatherSubject)subject).getWeatherContent();
        System.out.println(observerName+":"+weatherContent+","+remindThing);
        
    }

}

Subject模块

具体的目标对象,负责吧有关状态存入到相应的观察者对象中

public class CreateWeatherSubject extends WeatherSubject{
//获取天气的内容信息
    private String weatherContent;

    public String getWeatherContent() {
        return weatherContent;
    }

    public void setWeatherContent(String weatherContent) {
        this.weatherContent = weatherContent;
        //内容有了,说明天气更新了,通知所有订阅天气的人
        this.notifyObservers();
    }

    
    
}

这是一个观察者接口,定义一个更新的接口给那些目标发生改变的时候被通知的对象

public interface WeatherObserver {
public void update(WeatherSubject subject);
}
目标对象,他知道观察他的观察者,并提供添加和删除观察者的接口
import java.util.ArrayList;
import java.util.List;

public class WeatherSubject {
    //用于保存注册的观察者对象
    private List<WeatherObserver> observers =new ArrayList<WeatherObserver>();


    //把观察者添加到观察者集合中
    public void attach(WeatherObserver observer){

    observers.add(observer);
        
    }


    //删除观察者集合中指定的观察者.
    public void detach(WeatherObserver observer){

    observers.remove(observer);

    }


    //通知方法,需要通知观察者列表中的所有观察者.
    protected void notifyObservers(){

    for(WeatherObserver observer : observers){

    //把当前具体被观察者对象传入到update参数中,以便在update()方法中获取被观察者的状态信息.
    observer.update(this);

    } }


}

参考资料:

https://blog.csdn.net/chengyuqiang/article/details/79222294 

https://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html

 

 

猜你喜欢

转载自www.cnblogs.com/z715129849/p/9832995.html
今日推荐