观察者模式

翻译 2016年06月02日 08:58:04

所谓的观察者模式就是一组对象(Observer)观察一个对象(Subject)的状态,并在Subject状态改变时,产生一定的动作。
很显然,需要记录所有对Subject感兴趣的对象,需要有register/unregister,notify()等方法。下面通过一个简单的例子,让大家有一个感性的认识。

package com.example.observer;

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

/**
 * Created by Chuanhang.Gu on 2016/6/2.
 */
public class Subject {
    private int mOldNum;
    private List<Observer> mObservers = new ArrayList<>();


    public void attach(Observer observer) {
        //TODO
        if (mObservers.contains(observer)) {
            throw new IllegalStateException("观察者已经添加到了观察队列~");
        } else {
            mObservers.add(observer);
        }
    }

    public void detach(Observer observer) {
        if (!mObservers.contains(observer)) {
            throw new IllegalStateException("要删除的观察者不在观察队列~");
        } else {
            mObservers.remove(observer);
        }
    }

    public void setStatusChange(int newNum) {
        if (mOldNum != newNum) {
            mOldNum = newNum;
            for (int j = mObservers.size() - 1; j >= 0; j--) {
                mObservers.get(j).update();
            }
        } else {
            System.out.println("status is same to before!");
        }

    }

    public int getStatus() {
        return mOldNum;
    }


}

2.Observer需要持有Subject对象,有一个供Subject调用的update方法,在这里Object持有Subject对象不是必须的(可以通过update(Object object),将Observer需要的东西传递过来)

package com.example.observer;

/**
 * Created by Chuanhang.Gu on 2016/6/2.
 */
public abstract class Observer {
  protected  Subject subject;

    public abstract void update();
}
package com.example.observer;

/**
 * Created by Chuanhang.Gu on 2016/6/2.
 */
public class BinaryObserver extends Observer {

    public BinaryObserver(Subject subject){
    //持有Subject对象,便于获取Subject中相应的数据
        this.subject=subject;
        //将Observer添加到Subject的观察者队列中
        subject.attach(this);
    }

    public void update() {
        System.out.println("new num is :" + Integer.toBinaryString(subject.getStatus()));
    }
}
package com.example.observer;

/**
 * Created by Chuanhang.Gu on 2016/6/2.
 */
public class OctualObserver extends Observer {
    public OctualObserver(Subject subject) {
        this.subject = subject;
        subject.attach(this);
    }

    public void update() {
        System.out.println("new num is :" + Integer.toOctalString(subject.getStatus()));
    }
}
package com.example.observer;

/**
 * Created by Chuanhang.Gu on 2016/6/2.
 */
public class HexoObserver extends Observer {
    public HexoObserver(Subject subject){
        this.subject=subject;
        subject.attach(this);
    }
    public void update() {
        System.out.println("new num is :" + Integer.toHexString(subject.getStatus()));
    }
}
package com.example.observer;

/**
 * Created by Chuanhang.Gu on 2016/6/2.
 */
public class Main {
    public static void main(String[] args) {
        Subject subject = new Subject();

        new BinaryObserver(subject);
        new OctualObserver(subject);
        new HexoObserver(subject);
        subject.setStatusChange(100);
    }
}
注明:ArrayList contain 是根据对象的 equal方法判断是否相同的!

转载地址

http://www.tutorialspoint.com/design_pattern/observer_pattern.htm

观察者模式for android demo

  • 2017年09月30日 11:09
  • 22MB
  • 下载

对象间的联动——观察者模式(四)

22.4 JDK对观察者模式的支持       观察者模式在Java语言中的地位非常重要。在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了JDK对观...

Android基于观察者模式下载管理

  • 2017年11月08日 11:45
  • 459KB
  • 下载

Java的观察者模式

  • 2015年12月29日 21:59
  • 10KB
  • 下载

观察者模式的优缺点以及使用场景(三)

观察者模式的效果有以下的优点:第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。观察者模式有下面的缺点:第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很...

观察者模式练习

  • 2015年12月09日 20:35
  • 6KB
  • 下载

观察者模式框架2

  • 2017年08月11日 21:42
  • 48B
  • 下载

请根据观察者模式,用Java语言设计并实现气象站程序

青岛科技大学软件工程需求 设计模式作业 话不多说,直接上图,上链接:http://download.csdn.net/download/jinmie0193/10144068    有需要的下载下来...

观察者模式

  • 2013年03月07日 23:49
  • 17KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:观察者模式
举报原因:
原因补充:

(最多只允许输入30个字)