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

本文介绍了一种使用Java实现观察者模式的方法,通过具体实例展示了如何让多个观察者对象同时监听某一个主题对象,并在其状态发生变化时得到通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

观察者模式:所谓观察者模式就是一对象或多个对象对另一外一个对象所处的不同状态可以随意的做出不同的反应.
关于观察者模式我之前也有一篇文章介绍:
[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)把观察者加入进去就可以了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值