设计模式之观察者模式
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;
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() ; } }
相关文章推荐
- 深入浅出设计模式-002:观察者模式(Observer Pattern)
- 设计模式初探-观察者模式
- 设计模式(观察者)自己写的例子
- 设计模式-观察者模式
- 设计模式学习-----观察者模式
- 设计模式学习笔记——观察者模式
- .NET类库中发现设计模式:观察者模式
- 深入理解JavaScript系列(32):设计模式之观察者模式
- Java设计模式--观察者模式
- 设计模式学习--------2.观察者模式
- 安卓设计模式之观察者模式
- 设计模式详解之观察者模式
- java学习之观察者设计模式
- 设计模式:观察者模式
- JAVA设计模式-观察者模式简单例子
- 观察者设计模式
- GOF 23 设计模式之 观察者模式(Observer)
- 设计模式---Android中的观察者模式
- "围观"设计模式(31)--行为型设计模式总结(模板、观察者、策略、状态、责任链、命令、访问者、中介者、备忘录、解释器)
- C#设计模式之观察者模式实例讲解