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

利用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度");
    }

}

 

观察者优缺点

优点:

实现了观察者和目标之间的抽象耦合。

实现类动态联动。

支持广播通信。

 

确定:

可能引起无谓的操作(不一定每个用户都要执行update)。

 

何时使用观察者

建议在以下情况选用观察者模式

1,当一个抽象模型有两个方面,其中一个方面的操作依赖于另一个方面的状态变化。

2,如果在更改一个对象的时候,需要同时连带改变其他的对象,而且不知道究竟应该有多少对象需要被连带改变。

3,当一个对象必须通知其他的对象,但是你又希望这个对象和其他被通知的对象是松散耦合的。

 

posted @ 2018-04-25 22:40  美好的明天  阅读(289)  评论(0编辑  收藏  举报