java jdk 观察者模式_设计模式之JDK的Observer(观察者模式)

http://skyuck.iteye.com/blog/501027

那篇文章简单的模拟了一下观察者模式。

而这篇文章则是要利用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)把观察者加入进去就可以了。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2010-12-10 14:49

浏览 3788

评论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值