观察者模式

翻译 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

浅谈为什么设计模式要有观察者模式--观察者模式的意义

设计模式可以说是一种代码规范,也可以说是一种前人总结的奇技淫巧,对于后来编程者,学习设计模式可以对编程思路有一些启发,其中也包括经验启发. php相对java形式比较随意,所以对于模式设计更需要多花时...
  • h330531987
  • h330531987
  • 2017年09月03日 14:23
  • 377

一个用观察者模式解决实际问题的例子

前几天组里接到一个以前开发的已上线项目的维护任务,要求把其中的一些数据定时通过webservice接口上传到当地某市某平台上面,基本上算是个体力活儿了。 时间仓促只好加班加点,搜集比对 -->拼写S...
  • u012763117
  • u012763117
  • 2014年03月09日 02:31
  • 1482

观察者模式(看完马士兵视频的总结)

例子就是一个小孩在睡觉,当小孩醒过来之后,爸爸要喂奶,爷爷要
  • oWuGuanFengYue123
  • oWuGuanFengYue123
  • 2014年05月06日 11:45
  • 1614

JavaScript设计模式--观察者模式

一、定义观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式...
  • ligang2585116
  • ligang2585116
  • 2015年12月20日 19:22
  • 5083

Unity设计模式:观察者模式

初学编程的时候内容比较少没有数据交互,等内容多到需要多个文件多个类协同运行的时候就涉及到类之间的数据交互了。比较简单的数据交互是这些类之间互相引用,直接或间接传值或调用,但是这样类之间的耦合性太高了,...
  • ylbs110
  • ylbs110
  • 2016年12月31日 08:36
  • 531

观察者模式(这个用的太多了)

一.观察者模式的定义 定义对象间一种一对多的依赖关系,是的没当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 二.观察者模式的使用场景 (1).关联行为场景,需要注意的是,关联行...
  • u011889786
  • u011889786
  • 2016年04月04日 10:21
  • 883

线程安全的观察者模式的设计

观察者模式的应用,主要的行为就是注册和移除观察者(observer),以及通知所有已注册的Observers。这里介绍的是Chromium项目中实现的线程安全的观察者管理及通知的基础类Observer...
  • HorkyChen
  • HorkyChen
  • 2015年08月05日 01:12
  • 2912

设计模式实战应用之二:观察者模式

观察者模式的定义         观察者模式是应用最普遍的设计模式之一。著名的 MVC 模式就是观察者模式的应用之一。Gof 把观察者模式归类到对象行为型模式,《设计模式:可复用面向对象软件的基础》对...
  • defonds
  • defonds
  • 2013年12月04日 18:42
  • 5891

JAVA中观察者模式示例

观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟模式。观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象,“主题”和“观察者”之间是一种一对多的依赖关系 。当“主题”...
  • qq7342272
  • qq7342272
  • 2011年10月26日 15:36
  • 6915

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

观察者模式的效果有以下的优点:第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。观察者模式有下面的缺点:第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很...
  • MNJLJ_23NMK
  • MNJLJ_23NMK
  • 2016年04月21日 12:08
  • 4262
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:观察者模式
举报原因:
原因补充:

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