观察者模式:所谓观察者模式就是一对象或多个对象对另一外一个对象所处的不同状态可以随意的做出不同的反应.
关于观察者模式我之前也有一篇文章介绍:
[url]http://skyuck.iteye.com/blog/501027[/url]
那篇文章简单的模拟了一下观察者模式。
而这篇文章则是要利用jdk给我们提供的observer来实现上篇文章提供的场景
首先是我们的孩子类是被观察者要继承Observable类。
在这个类中当孩子的状态发生变化时,也就是这里的change方法中我们要通过this.setChanged方法告诉观察者孩子的状态发生变法。并通过this.notifyObservers(b)方法将孩子的状态告诉观察者。
下面是我们的观察者类,这个类要实现Observer接口
在这个类中我们要实现Observer接口中的update(Observable o, Object arg)方法。
在这个方法中我们可以根据被观察者的状态进行不同的操作。
然后是状态类,在这里就是关于孩子醒的这个状态
在这里其实也用到了上篇文章介绍的适配器模式。因为孩子的状态可以有很多种状态。因为要根据孩子的不同状体观察者做出不同的反应。
最后当然是我们的测试类:
这里我们也可以添加其他的观察者。只需要通过c.addObserver(f)把观察者加入进去就可以了。
关于观察者模式我之前也有一篇文章介绍:
[url]http://skyuck.iteye.com/blog/501027[/url]
那篇文章简单的模拟了一下观察者模式。
而这篇文章则是要利用jdk给我们提供的observer来实现上篇文章提供的场景
首先是我们的孩子类是被观察者要继承Observable类。
package com.zzg.observer;
import java.util.Observable;
public class Child extends Observable implements Runnable {
private B b;
public Child(B b) {
this.b = b;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
change();
}
private void change() {
b.event();
this.setChanged();
this.notifyObservers(b);
}
}
在这个类中当孩子的状态发生变化时,也就是这里的change方法中我们要通过this.setChanged方法告诉观察者孩子的状态发生变法。并通过this.notifyObservers(b)方法将孩子的状态告诉观察者。
下面是我们的观察者类,这个类要实现Observer接口
package com.zzg.observer;
import java.util.Observable;
import java.util.Observer;
public class Father implements Observer {
private void eatToChild(){
System.out.println("eat to Child");
}
private void sing(){
System.out.println("sing to Child");
}
@Override
public void update(Observable o, Object arg) {
if(arg instanceof WeekUpEvent){
WeekUpEvent event = (WeekUpEvent)arg;
if("bj".equals(event.getLocation())){
eatToChild();
}
if("zz".equals(event.getLocation())){
sing();
}
}
}
}
在这个类中我们要实现Observer接口中的update(Observable o, Object arg)方法。
在这个方法中我们可以根据被观察者的状态进行不同的操作。
然后是状态类,在这里就是关于孩子醒的这个状态
package com.zzg.observer;
public class WeekUpEvent implements B{
private long time;
private String location;
private Object source;
public WeekUpEvent(long time, String location, Object source) {
this.time = time;
this.location = location;
this.source = source;
}
public long getTime() {
return time;
}
public void setTime(long time) {
this.time = time;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = source;
}
@Override
public void event() {
System.out.println("醒了");
}
}
package com.zzg.observer;
public interface B {
void event();
}
在这里其实也用到了上篇文章介绍的适配器模式。因为孩子的状态可以有很多种状态。因为要根据孩子的不同状体观察者做出不同的反应。
最后当然是我们的测试类:
package com.zzg.observer;
public class Test {
public static void main(String[] args) {
WeekUpEvent weekUpEvent = new WeekUpEvent(System.currentTimeMillis(),"zz",null);
Child c = new Child(weekUpEvent);
Father f = new Father();
c.addObserver(f);
new Thread(c).start();
}
}
这里我们也可以添加其他的观察者。只需要通过c.addObserver(f)把观察者加入进去就可以了。