观察者模式

翻译 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
  • 22.00MB
  • 下载

Java的观察者模式

  • 2015-12-29 21:59
  • 10KB
  • 下载

观察者模式的c++代码实现

观察者模式--观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

观察者模式练习

观察者模式

观察者模式又称为发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够够自动更新自己.          ...

观察者模式框架2

观察者模式

  • 2013-03-07 23:49
  • 17KB
  • 下载

观察者模式

观察者的本质含义如下面图: 把上述行为抽像出来即是如下类图: 把上面类图以一下例子来实现。这个例子讲的是,一个气象站的公告电子牌,如果气象站的数据有更新,则各电子公告牌也应该更新,这时气像...

观察者模式

内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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