您的位置:首页 > 编程语言 > Java开发

设计模式之观察者模式

2013-08-04 22:18 351 查看
观察者模式:定义对象间一对多的依赖关系,当一个对象发生变化后会立即通知其他对象。

生活中有很多这种例子,当一个事件发生会触发多个响应对象来对这个事件的发生做出自己的响应,比如下面这个例子:

我和妹妹让妈妈告诉我们饭做好了,这样我们就可以来吃饭了。换用较为技术化的语言来说,当系统的主题(饭)发生变化时,就告诉系统的其它部份(观察者们,也就是妈妈、我和妹妹),使其可以调整内部状态(有开始吃饭的准备),并采取相应的行动(吃饭)。

package com.alan.observer.cook;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Mam extends Thread{

private boolean isCooked =false ;
//用来承这个对象的监听对象的容器
private List<CookingListener> containerListener = new ArrayList<CookingListener>() ;
//产生一个随机变量来模拟妈妈做饭这个过程
private Random random = new Random() ;
@Override
public void run() {
while(!isCooked){
System.out.println("mam is cooking...");
try {
Thread.sleep(2000) ;
} catch (InterruptedException e) {
e.printStackTrace();
}
//当随机数大于45的时候表示妈妈已经把饭做好了.
if(random.nextInt(50) >45){
dinnerIsCooked() ;
}
}
}

public void dinnerIsCooked(){
isCooked = true ;
//当饭菜做好的时候个个对象做出响应
for(CookingListener listener:containerListener){
//观察者模式中的拉模式,将事件源作为参数传递到监听对象中,各个监听对象可以根据自身的需要对这个事件做出不同的响应
listener.isCooked(new CookingEvent("isCooked", this)) ;
}
}
public void addListener(CookingListener listener){
containerListener.add(listener) ;
}
}

package com.alan.observer.cook;

public interface CookingListener {

void isCooked(CookingEvent event) ;
}

package com.alan.observer.cook;

public class CookingEvent {

private String eventType ;
private Object source ;
public CookingEvent(String eventType,Object source){
this.eventType = eventType ;
this.source = source ;
}
}

package com.alan.observer.cook;

public class Son implements CookingListener{

@Override
public void isCooked(CookingEvent event) {
// TODO Auto-generated method stub
System.out.println("我妈,你做的啥给俺kei的呀?");
}

}

package com.alan.observer.cook;

public class Daughter implements CookingListener{

@Override
public void isCooked(CookingEvent event) {
// TODO Auto-generated method stub
System.out.println("妈妈,你弄啥好吃的给你宝贝女儿kei的呀");
}

}

package com.alan.observer.cook;

public class Test {
public static void main(String[] args) {
Mam mam = new Mam() ;
mam.addListener(new Son()) ;
mam.addListener(new Daughter()) ;

mam.start() ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java