观察者模式

对观察者模式稍作整理:

 

 GoF:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:

1, 观察者(具体执行操作的对象,有多个)
2, 被观察者(顾名思义是被观察的对象,如果该对象发生某些变化则通知观察者执行对应的操) 
 

被观察者:

package java.util;
public class Observable {
    private boolean changed = false;
    private Vector obs;
   
    //创建被观察者时就创建一个它持有的观察者列表,注意,这个列表是需要同步的。
    public Observable() {
	obs = new Vector();
    }

    /**
     * 添加观察者到观察者列表中去
     */
    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
	if (!obs.contains(o)) {
	    obs.addElement(o);
	}
    }

    /**
     * 删除一个观察者
     */
    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }

/** * 与上面的那个通知方法不同的是,这个方法接受一个参数,这个参数一直传到观察者里,以供观察者使用 */ public void notifyObservers(Object arg) { Object[] arrLocal; synchronized (this) { if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg); } }


观察者:

package java.util;
public interface Observer{
   void update(Observable o, Object arg);
}


 观察者的实现,读者:

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

public class Reader implements Observer{

	public void update(Observable o, Object arg) {
		System.out.println("读者收到消息,并执行更新操作!");
	}
}

 

主题:继承了被观察者,所以通知程序已经写好

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

public class Subject extends Observable {

	public void perform(){
		//业务处理
		
		//标志为改变后通知所有观察者
		super.setChanged();
		super.notifyObservers(null);
	}
	
	public static void main(String[] args) {
		
		//新增一个观察者
		Observer reader = new Reader();
		
		//创建被观察者,并将观察者加入到自身的列表中
		Subject subject = new Subject();
		subject.addObserver(reader);
		
		//执行自身的业务
		subject.perform();
	}
}



 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值