模式的秘密-观察者模式(三)

利用Java提供的观察者实现

java.utill包:Observable类。

接口:Observer  update方法。

Java实现与自己实现的对比。

四点:

第一:不需要再定义观察者和目标的接口,JDK帮忙定义。

第二:具体的目标实现不需要维护观察者的注册信息了,这个Java中Observable类里面以及帮忙实现好了。

第三:触发通知的方式有一点变化,需要先调用setChanged方法,这个是Java为了帮助实现更精确的触发控制而提供的功能。

第四:具体观察者的实现里面,update方法其实能同时支持推模型和拉模型,这个在Java定义的时候,以及考虑进去了。

利用Java提供的观察者实现:

第一步:创建具体实现类,继承观察类

注意:在通知之前,在用java中的observer模式的时候,下面这句话不可少。

通知调用this.notifyObservers,如果是推的,需要传入参数,如果是拉的,不需要传参数。

package com.WeatherJavaObserverPattern;
import java.util.Observable;

//天气目标的具体实现类
public class ConcreteWeatherSubject extends Observable {
    //天气情况的内容
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
        //天气情况有了,就要通知所有的观察者
        
        //注意:在通知之前,在用java中的observer模式的时候,下面这句话不可少
        this.setChanged();
        
        //然后主动通知,这里先用推的方式
        this.notifyObservers(content);
        
        //如果是拉的方式,我们用
        //this.notifyObservers();
    }
}

第二步:创建观察者对象。

注意:重写update方法。

package com.WeatherJavaObserverPattern;

import java.util.Observable;
import java.util.Observer;

//具体的观察者对象
public class ConcreteObserver implements Observer {

    //观察者名称的变量
    private String observerName;
    
    public String getObserverName() {
        return observerName;
    }
    public void setObserverName(String observerName) {
        this.observerName = observerName;
    }
    @Override
    public void update(Observable o, Object arg) {
        //第一种是推的方式
        System.out.println(observerName+"手动的消息,目标推送过来的是"+arg);
        //第二种是拉的方式
        //System.out.println(observerName+"手动的消息,主动到目标对象中去拉,拉的内容是"+
        //        ((ConcreteWeatherSubject)o).getContent());
    }
}

测试:

package com.WeatherJavaObserverPattern;

//测试类
public class Client {

    public static void main(String[] args) {

        //创建天气作为一个目标,也可以说是被观察患者
        ConcreteWeatherSubject subject=new ConcreteWeatherSubject();
        
        //创建黄明的女朋友作为观察者
        ConcreteObserver girl=new ConcreteObserver();
        girl.setObserverName("黄明女朋友");
        //创建黄明的老妈作为观察者
        ConcreteObserver Mum=new ConcreteObserver();
        Mum.setObserverName("黄明老妈");
        
        //注册观察者
        subject.addObserver(girl);
        subject.addObserver(Mum);
        
        //目标更新天气情况
        subject.setContent("天气晴,气温28度");
    }

}

猜你喜欢

转载自www.cnblogs.com/alsf/p/8947915.html
今日推荐