码迷,mamicode.com
首页 > 编程语言 > 详细

java设计模式之观察者模式

时间:2015-12-02 01:07:59      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:观察者   设计模式   

观察者模式(ObserverPattern)。用于实时监测某些Object的动态、只要Object一改变、那么他的所有观察者Observer都会知道、之后观察者会根据Object的改变进行下一步操作。这个在SWING编程中是最常见的。那些Listener就是观察者。


观察者模式角色如下:

抽象主题(Subject)角色:抽象主题角色提供维护一个观察者对象聚集的操作方法,对聚集的增加、删除等。

具体主题(ConcreteSubject)角色:将有关状态存入具体的观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色负责实现抽象主题中聚集的管理方法。

抽象观察者(Observer)角色:为具体观察者提供一个更新接口。

具体观察者(ConcreteObserver)角色:存储与主题相关的自洽状态,实现抽象观察者提供的更新接口。


六大问题:

1、目标与观察者之间的关系

    一对多  或者 多对一

2、单向依赖:观察者被动等待目标

3、命名建议:subject  observer  update

4、触发更新的时机

5、观察者模式的调用顺序示意图:

    创建目标  创建观察者  注册观察者

6、通知的顺序

    观察者之间是平行通知优先级


两种模型:

1、推模型:update传递目标对象的部分信息

2、拉模型:update传递目标对象本身


优缺点:

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

2、观察者模式实现了动态联动

3、支持广播通信

4、会引起无谓的操作


何时使用观察者模式:

    触发联动


采用java自带的观察者模式:

    目标代码:

package com.nudt.design.javaObserver;

import java.util.Observable;

/**
 * Created by jeffrey on 15-12-1.
 */
public class ConcreteWeatherSubject extends Observable {
    private String weatherContend;

    public String getWeatherContend() {
        return weatherContend;
    }

    public void setWeatherContend(String weatherContend) {
        this.weatherContend = weatherContend;
        this.setChanged();
        this.notifyObservers(weatherContend);//推模式
        //this.notifyObservers();//拉模式
    }
}

    观察者代码:

package com.nudt.design.javaObserver;

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

/**
 * Created by jeffrey on 15-12-1.
 */
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 observable, Object o) {
        //推的方式
        System.out.println(observerName + "get:"+ o);
        //拉的方式
        //System.out.println(observerName +"get:" + ((ConcreteWeatherSubject)observable).getWeatherContend();
    }
}

区别对待观察者场景

    就是简单的判断语句

java设计模式之观察者模式

标签:观察者   设计模式   

原文地址:http://muyunzhe.blog.51cto.com/9164050/1718672

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!