观察者模式是程序设计中用得非常多的一种设计模式之一,如按钮的单击事件就是使用了观察者模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。
在java中的gui编程中,典型的事件模型包括:事件对象,事件源对象,事件监听对象,与观察者模式的角色对应如下:
事件源对象:----->被观察的对象
事件监听对象:----->观察的对象
事件对象:---->被观察者告诉观察者某件事情发生了,事件对象中包括了一些有用的信息
先用生活中例子说明.
一个漂亮的女孩身边不乏男孩子的追求,这些男孩子都时时刻刻想了解女孩子的状况,如现在的地点,现在心情怎么样..
由于女孩子都比较善良,不忍心伤害这些追求者,所以隔一段时间就像追求者发送自己的状况,所以女孩子非常的苦恼。。。
现在讲我们的观察者模式运用到这个实例上面。
1、事件对象:(EmotionEvent) 继承EventObject
public class EmotionEvent extends EventObject
{
//自定义一个事件,其中source是事件源对象
public EmotionEvent(Object source)
{
super(source);
// TODO Auto-generated constructor stub
}
}
2、监听器接口(EmotionListener)继承了EventListener
import java.util.EventListener;
public interface EmotionListener extends EventListener
{
public void update(EmotionEvent event);
}
3、女孩对象(被观察者)
public class Girl
{
private List<EmotionListener> listener=new ArrayList<EmotionListener>();
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public void addListener(EmotionListener lis)
{
listener.add(lis);
}
public void removeListener(EmotionListener lis)
{
listener.remove(lis);
}
public void notify(EmotionEvent event)
{
for(EmotionListener lis:listener)
{
lis.update(event);
}
}
}
4、男孩对象(观察者)
public class Boy implements EmotionListener
{
@Override
public void update(EmotionEvent event)
{
// TODO Auto-generated method stub
Girl girl=(Girl)event.getSource();
System.out.println(girl.getName()+","+"你有什么不开心的,说出来让我开心一下。");
}
}
5、测试
public class Test
{
public static void main(String[] args)
{
Girl girl=new Girl();
girl.setName("aviva");
EmotionEvent event=new EmotionEvent(girl);
Boy boy1=new Boy();
Boy boy2=new Boy();
girl.addListener(boy1);
girl.addListener(boy2);
girl.notify(event);
}
}
通过上面的实例,与Button的单击事件练习起来,可以对按钮的单击事件有个很好的理解的。