观察者模式,只从语义上来理解像是观察者个对象,看它的状态是否有变化。可是在程序当中观察者模式则是恰恰相反。
观察者模式的定义是,一个被观察的对象对应了多个观注了它的对象。当这个被观察的对象的状态或是属性发生变化的时候,
它会及时的通知那些观注了它的对象。这个在生活当中有很多这样的例子,我不怕找不来。
比如:有很多人订阅了报纸,在当天有很多的新闻发生,记者们将它们都一一的记录下来,然后回到报社交给报社。报社将这些新闻
印刷在报纸上,第二天的时候由报社的工作人员将每一套报纸送到订阅报纸的客户手上。整个过程是当有新闻发生,产生新的报纸,将报纸送到客户手上。
我想说,这一个例子是再好不过的了。
一面是一个代码的例子:
在JAVA jdk中有了已经封装好了的观察者对象(客户 Observer)和产品类对象(被观察者 Observable)
package com.lovo.subject;
import java.util.Observable;
public class ObjSubject extends Observable{
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
setChanged(); //设置该属性可以被修改
notifyObservers(name); //通知观察者对象,该产品类对象的该属性值已更新
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
setChanged();
notifyObservers(new Integer( age ));
}
}
package com.lovo.product;
import java.util.Observable;
import java.util.Observer;
public class ObjProduct implements Observer{
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
if(arg instanceof String)
System.out.println(" 用户名更新为: " + arg );
if(arg instanceof Integer){
System.out.println("年龄更新为:" + arg );
}
}
}
package com.lovo.main;
import com.lovo.product.ObjProduct;
import com.lovo.subject.ObjSubject;
public class TestMain {
public static void main(String[] args){
ObjSubject os = new ObjSubject(); //产品类对象
ObjProduct op = new ObjProduct(); //观察者对象
os.addObserver(op);
os.setName("11111");
os.setAge(12);
os.setName("wangl");
os.setAge(23);
}
}