关闭

观察者模式

标签: 设计模式
190人阅读 评论(0) 收藏 举报
分类:

所谓的观察者模式就是一组对象(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

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:151831次
    • 积分:2854
    • 等级:
    • 排名:第12464名
    • 原创:110篇
    • 转载:11篇
    • 译文:18篇
    • 评论:32条
    最新评论