设计模式之观察者模式

观察者模式:定义对象间一对多的依赖关系,当一个对象发生变化后会立即通知其他对象。

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

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

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() ;
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值