observer模拟监听器的实现
学习了awt,尤其是swing,就知道swing中的观察者模式应用广泛。例如,在button.addActionListener(...),一旦点击按钮,就可以触发相应的事件。很多人一定想知道内在机理。
假设有一台电脑。电脑里有一个事件。当您按下电源按钮时,显示屏将亮起,电源指示灯也将亮起。
Examda提示:这是GUI中按钮事件的典型模拟。
我们来分析一下需要多少节课。
电脑肯定是要的,我们上电脑课。计算机类内部有一个按电源键的动作,叫做clickButton。这个事件叫做EventPowerOn,所以获得了EventPowerOn类。另外,相对于GUI中的按钮,它们都添加了监听器,所以应该有一个监听器类,我们称之为EventPowerOnListener。到目前为止,我们基本上已经找出了几个必要的类,Computer,EventPowerOn,EventPowerListener
我们写出它们的框架:
公共类Computer实现Runnable {
Public Void clik button(){ }//如果调用了这个方法,那么按下电源按钮
}
公共类事件poweron {
私有对象源;//事件的来源,即哪个对象激发了time
private long time;//这个属性是随机添加的,比如按下电源键时
公共事件poweron(长时间,object object){
super();
this . source = object;
this . time = time;
}
public Object getObject(){
返回源;
}
public void set Object(Object Object){
this . source = Object;
}
public long getTime(){
return time;
}
public void setTime(long time){
this . time = time;
}
}
公共接口EventPowerOnListener {
公共void performance topoworon(EventPowerOn EventPowerOn);//改变方法是按下电源键时的响应
/
}
Examda提示:刚才我们说了,按下电源键时,显示屏和电源指示灯都会亮。那么显示器和电源指示器就要做成单独的类
,于是就有:
公共类screen实现eventpower listener {
public void performance topoworon(EventPowerOn EventPowerOn){
system . out . println(EventPowerOn . gettime());
system . out . println(" Screen on ");
}
}
public类Light实现EventPowerOnListener {
public void performance topoworon(EventPowerOn EventPowerOn){
system . out . println(EventPowerOn . gettime());
System.out.println("电源灯亮");
}
}
为什么我们要用它们来实现监听器类?因为对电脑来说,他们都是听众。按下电源按钮后,显示屏和电源指示灯应做出响应。
那么如何给电脑添加屏幕和灯光呢?我们做如下修改
public class computer {
private list listeners = new ArrayList();
public void addEventPowerOnListener(EventPowerOnListener EventPowerOnListener)
{
listeners . add(EventPowerOnListener);
}
public void clik button(){
for(EventPowerOnListener temp:listeners)
{
temp . performance topoworon(new event poweron(system . current time millis(),this));
}
}
}
好了,一个模拟的例子完成了。我们来测试一下:
public class test observer {
public static void main(string[]args){
computer computer = new computer();
Screen Screen = new Screen();
Light Light = new Light();
computer . addeventpoweronlistener(screen);
computer . addeventpoweronlistener(light);
computer . click();
};
}
剧场的结果:
1219215665656
屏幕亮了
1219215665656
电源灯亮了
说明一下clickButton,那么显示器和电源指示灯都会我们还可以添加其他的监听器,比如硬盘会转动。。。只需实现listner接口,并将其添加到计算机的监听列表中。。。
(最近回头看java的一些基础的东西,在看swing的时候,突然想知道观察者模式是怎么实现的。我研究了一下,看了一些源代码,得到了一些经验,顺便写了出来。
0条评论