基于事件的隐式调用风格
基本组件:对象或过程,并分类为以下更小的组件
–过程或函数,充当事件源或事件处理器的角色
–事件
连接件:事件-过程绑定
–过程(事件处理器,事件的接收和处理方) 向特定的
事件进行注册;
–组件(事件源) 发布事件;
–当某些事件被发布(触发) 时,向其注册的过程被隐式调用;
–调用的次序是不确定的;
优点
§支持实现交互式系统(用户输入/网络通讯)
§异步执行,不必同步等待执行结果
§对事件的并发处理将提高系统性能;
缺点:
分布式控制方式使系统的同步、验证和调试变得异常困难:
–组件放弃了对系统计算的控制,难以控制各模块之间的处理次序。一个组件触发一个事件时,不能确定其它组件是否会响应它。而且即使它知道事件注册了哪些组件的构成,它也不能保证这些过程被调用的顺序。
–既然过程的语义必须依赖于被触发事件的上下文约束,关于正确性的推理则难以保证。
–传统的基于先验和后验条件的验证变得不可能。
程序:
1.基于事件的隐式调用风格
常用控制组件的事件——按钮与动作事件(ActionEvent),参见下例。
按钮与动作事件运行结果
importjava.awt.*;
importjava.awt.event.*; //引入java.awt.event包处理事件
classBtnLabelAction extends Frame implements ActionListener{
//声明窗口类(BtnLabelAction)并实现动作事件接口(ActionListener)
Labelprompt;
Buttonbtn;
voidCreateWindow(){ //自定义方法
setTitle("MyButton");
prompt =new Label("你好"); //创建标签对象
btn =new Button("操作"); //创建按钮对象
setLayout(newFlowLayout()); //布局设计,用于安排按钮、标签的位置
add(prompt); //将标签放入容器
add(btn); //将按钮放入容器
btn.addActionListener(this); //将监听器(窗体对象本身)注册给按钮对象
setSize(300,100);
setVisible(true);
}
publicvoid actionPerformed(ActionEvent e){//接口ActionListener的事件处理方法
if(e.getSource()==btn) //判断动作事件是否是由按钮btn引发的
if(prompt.getText()=="你好")
prompt.setText("再见");
else
prompt.setText("你好");
}
}
public class BtnTest{
publicstatic void main (String args[]){
BtnLabelActionbla=new BtnLabelAction();
bla.CreateWindow();
}
}