设计模式_观察者模式

观察者模式的实现由好几种,其中最简单的一种是java的SDK自带的一种,这里均介绍下,如果不完整可以参考本站“文件”板块上传的观察者模式rar包中的内容来理解,先来个自带的实现代码

package com.observer;

import java.util.Observable;

/**
 * Observable类是java自带的,他里面的setChanged(),notifyObservers(weatherContent)用来设置改变跟通知,内部已经实现了,所以我们只管调用即可
 * Created by wuyawei on 2017/5/9.
 */
public class CreateWeather extends Observable {
    private String weatherContent;

    public String getWeatherContent() {
        return weatherContent;
    }

    public void setWeatherContent(String weatherContent) {
        this.weatherContent = weatherContent;
        this.setChanged();
        this.notifyObservers(weatherContent);
    }
}
package com.observer;

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

/**
 * Created by wuyawei on 2017/5/9.
 */
public class CreateObserv 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(this.observerName+"目标推送过来的是:"+arg);
        System.out.println(this.observerName+"收到的消息内容是:"+((CreateWeather)o).getWeatherContent());
    }
}
package com.observer;

/**
 * Created by wuyawei on 2017/5/9.
 */
public class Test {
    public static void main(String[] args) {
        //创建天气作为一个目标
        CreateWeather createWeather = new CreateWeather();
        //创建两个观察者对象
        CreateObserv grilFrend = new CreateObserv();
        grilFrend.setObserverName("gril frends");
        CreateObserv mum = new CreateObserv();
        mum.setObserverName("mum");
        //注册观察者
        createWeather.addObserver(grilFrend);
        createWeather.addObserver(mum);
        //更新天气状况
        createWeather.setWeatherContent("今天下雨了");
    }
}

自定义实现观察者模式

package com.ovserver01;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by wuyawei on 2017/5/9.
 */
public class Subject {
    private List<Observer> observerList = new ArrayList<>();

    /**
     * 添加观察者对象
     */
    public void addObserver(Observer observer){
        observerList.add(observer);
    }

    /**
     * 删除观察者对象
     */
    public void deleteObserver(Observer observer){
        observerList.remove(observer);
    }
    /**
     * 通过所有注册的观察者对象
     */
    public void notifyObservers(){
        for(Observer observer : observerList){
            observer.update(this);
        }
    }
}
package com.ovserver01;

/**
 * 这是一个观察者接口,定义一个更新的接口给那些在目标发生变化时被通知的对象
 * Created by wuyawei on 2017/5/9.
 */
public interface Observer {
    public void update(Subject subject);
}
package com.ovserver01;

/**
 * 具体的目标对象,负责把有关状态存入到相应的观察者对象中
 * Created by wuyawei on 2017/5/9.
 */
public class CreateSubject extends Subject {
    //获取天气内容信息
    private String subjectStatus;

    public String getSubjectStatus() {
        return subjectStatus;
    }

    public void setSubjectStatus(String subjectStatus) {
        this.subjectStatus = subjectStatus;
        this.notifyObservers();
    }
}
package com.ovserver01;

/**
 * Created by wuyawei on 2017/5/9.
 */
public class CreateObserver implements Observer {
    // 定义观察者的名字,都有哪些人关注天气
    private String observerStutas;
    //天气信息,此信息从目标处获取
    private String weatherContent;
    //消息内容,每个观察者提醒的内容不相同,就是每个观察天气的人收到天气信息后要做什么
    private String madeSomething;
    /**
     * 获取目标类状态同步到观察者的状态中
     */
    @Override
    public void update(Subject subject) {
        weatherContent = ((CreateSubject)subject).getSubjectStatus();
        System.out.println(observerStutas+"收到的"+weatherContent +"然后他们去"+ madeSomething);
    }

    public String getObserverStutas() {
        return observerStutas;
    }

    public void setObserverStutas(String observerStutas) {
        this.observerStutas = observerStutas;
    }

    public String getWeatherContent() {
        return weatherContent;
    }

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

    public String getMadeSomething() {
        return madeSomething;
    }

    public void setMadeSomething(String madeSomething) {
        this.madeSomething = madeSomething;
    }
}

test

package com.ovserver01;

/**
 * Created by wuyawei on 2017/5/9.
 */
public class Test {
    public static void main(String[] args) {
        /**创建目标*/
        CreateSubject createSubject = new CreateSubject();
        /**创建观察者并且注册*/
        CreateObserver grilFrend = new CreateObserver();
        grilFrend.setObserverStutas("女票");
        grilFrend.setMadeSomething("约会");
        CreateObserver brother = new CreateObserver();
        brother.setObserverStutas("兄弟");
        brother.setMadeSomething("打麻将");
        /**注册观察者*/
        createSubject.addObserver(grilFrend);
        createSubject.addObserver(brother);
        /**发布天气信息*/
        createSubject.setSubjectStatus("天气状况为良好");
    }
}

暂时用这两种实现,其他版本的实现方法都是大同小异,本人已在本博客的文件中上传了,有兴趣可以下载参考

 

posted @ 2017-05-09 10:11  青春不打烊  阅读(153)  评论(0编辑  收藏  举报