ITKeyword,专注技术干货聚合推荐

注册 | 登录

设计模式:观察者模式(observer) java实现及原理

dxswzj 分享于 2013-06-16

推荐:Java设计模式-观察者设计模式

查阅网上的资料大家都喜欢叫 观察者 被观察者的用语 不乱看起来还是听起来都是很刺耳的节奏,所以我觉得: 观察者模式---注册者  通知者,比如说你上网注册了个

2020腾讯云7月秒杀活动,优惠非常大!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1040

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。即被观察者改变会自动通知观察者,观察者根据被观察者的变化进行一系列操作。

大概步骤:

1.      创建被观察者, (继承java.util.Observable),在发生改变的地方必须调用

setChanged();//为什么需要调用这两个方法?等下讲原理的时候会提到

notifyObservers();//只有先调用setChanger()后这个才会通知观察者

//也可以是notifyObservers(Object obj);这个是实现带参数的通知,这个参数传递给观察者里的void update(Observable o, Object arg) 方法里的arg参数。

2.      创建观察者,(实现java.util.Observer)

3.      客户端调用时被观察者增加观察者被观察者.addOberver(观察者) ,多个可以增加多次

好了直接看个例子会更好的理解:

例子是这样的一个嫌疑犯生活在厦门,厦门公安甚至国安局都会对他的动向进行观察、跟踪。


 //嫌疑犯 被参观者 需要继承Observable

 

public class Suspect extends Observable{
   private String name;
   public Suspect(String sName){
	   this.name = sName;
   }
   public String getName(){
	   return this.name;
   }
   public void move(){
	   String sCity = "澳门";
	   System.out.println("嫌疑犯"+name+"去"+sCity);
	   setChanged();
	   notifyObservers(sCity);
   }
}

//观察者 需要实现Observer

public class XmPolicemen implements Observer{
	public void update(Observable o, Object arg) {
		 Suspect s = (Suspect)o;
		 System.out.println("厦门公安请注意:嫌疑犯" + s.getName()+"去"+arg+"了!");
	}
}

 //客户端

public class Client {
	public static void main(String[] args){
		Suspect s = new Suspect("lideng");
		XmPolicemen p = new XmPolicemen();
		s.addObserver(p);
		s.move();
	}
}

@输出:嫌疑犯lideng去澳门
                厦门公安请注意:嫌疑犯lideng去澳门了!

看到没,当主题对象(被观察者)的状态发生变化后,会通知观察者,使观察者可以相应改变化并做一列举的操作。


如果现在国安局也想监测跟踪嫌疑犯的,那怎么办?

首先写个国安局CenPolicement /(观察者 需要实现Observer 参考XmPolicement),无需改动Suspect(被参观者)

推荐:浅谈JAVA设计模式之——观察者模式(Observer)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45600577 一、概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有

然后客户端改为(增加s.addObserver())

public class Client {
	public static void main(String[] args){
		Suspect s = new Suspect("lideng");
		XmPolicemen xp = new XmPolicemen();
                CenPolicemen cp = new CenPolicemen();
		s.addObserver(xp);
		s.addObserver(cp);
		s.move();
	}
}



@解释:

到底内部是怎么个实现机制?

为什么需要调用setChanged();  notifyObservers();或notifyObservers(Object obj);

让我们先看下Observable的源代码的内容:

有两个变量

    private boolean changed = false;//保存是否状态被更改
    private Vector obs;         //保存所有的观察者

注册观察者是通过调用addObserver(Observer o)方法实现的

    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
	if (!obs.contains(o)) {
	    obs.addElement(o);
	}
    }

再看下setChanged方法(改变changed值,设为状态已经被改变)

    protected synchronized void setChanged() {
	   changed = true;
    }

再就是notifyObservers() 或 notifyObservers(Object obj)方法

    public void notifyObservers() {
	   notifyObservers(null);
    }
    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);
    }
看到
for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);

你应该会明白为什么被观察者的改变会通知到观察者哪里去,就是这里调用的。

再看下接口Observer的代码:

public interface Observer {
    void update(Observable o, Object arg);
}

接口Observer很简单,就一个方法update(Observable o,Object arg);第一个参数是被参观者对象,第二个参数是notifyObservers(Object obj)方法传入的参数。



推荐:java观察者设计模式

观察者模式在软件编程中用的较多,我不善于表达我就用在网上看到的故事,和生活的例子说下基本思想  故事:    小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多

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

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。