面向事件编程
来源:互联网 发布:洗钱 知乎 编辑:程序博客网 时间:2024/06/07 05:54
如果要用一句俗一点的话来解释什么是面向事件编程,那句话就是:面向钩子编程。
什么是钩子呢?写过 GUI 的人,一般都接触过面向事件编程。那在 GUI 中,钩子在哪里呢?说钩子之前,先说一下元素。界面编程中有各种各样的元素,有看得见的,例如按钮、输入框,也有看不见的,例如 Socket 、异常。而这些元素下挂满了各式各样的构子(事件)例如常见的“ click ”(有些平台下,用户可以自定义构子,例如Flex )。这些钩子中,有些是由用户触发的,例如:键盘输入、鼠标点击,有些是由远程触发的,例如: Socket、 IO ,也有由系统触发的,例如:异常。
知道了什么是钩子之后,再了解一下面向钩子编程有哪些步骤。一般来说,要用某平台的 GUI 来编程有三个步骤,第一是了解各元素下有哪些钩子、第二步是编写需要被触发的代码、第三步就是把你写的代码正确地放在钩子上。
面向事件编程:新瓶旧酒。
我们中的很大一部份人都是写后台程序出身。作为一个后台程序员,刚接触 GUI 编程时可能会认为面向事件编程是个新东西。其实你早已认识它。
作来后台程序员,你或多或少听过多线程吧?还记得多线程模式中的 Future 模式吗? GUI 初始化后,主类就监听各元素。而各元素开始工作:向服务端请求、数据处理、计算、等待客户输入等。每当元素做完工作就会notify 主类,也就是触发钓子。如果你在钓子上挂了段代码,那段代码就运行起来。
好了,多线程你用得不多。那 GoF 的 Observer 模式你可能比较熟。元素的事件就是目标对像、而你写的代码就是观察者。元素的事件被触发后,观察者就被通知,而你注册在事件上的代码就被执行。
其实现在常见 GUI 的面向事件编程就是多线程下的观察者模式。像 IO 操作、向服务端请求、元素更新,更贴近于 Future 模式。而一般的用户触发的事件更贴近观察者模式。
面向事件编程:常见陷阱。
<!---->1、 <!---->异常。如果你习惯于后台编程,接触到的异常一般都是同步的。而 GUI 的面向事件编程是中有部份异常是异步的。也就是说如果你要处理异步错误,你需要通过添加事件监听器来处一是。
<!---->2、 <!---->隐蔽的异步构子。有些元素的外观更新是异步的。像近来在 HIM 中修复的一个 BUG 的情况。程序监听 XMLSocket 的 DataEvent.DATA 事件,当检查到是消息协议时,向消息框 TextArea 添加信息。由于要向用户显视最新的信息,也就是 TextArea 最下边的信息,所以在添加完后,还要获取 TextArea 的最大垂直高度,然后设置 TextArea 的重直滚动高度为最大垂直高度。代码如下:
- override public function deal(str:String):void {
- this.face.getMsgArea().htmlText+=str.match(this.getPattern())[1]+"<br/>";
- face.getMsgArea().verticalScrollPosition=face.getMsgArea().maxVerticalScrollPosition;
- }
这样处理的结果是当消息长度超过一行时,只显视到消息的第一行。后来找到的原因是 TextArea 的信息更新是异步的,我运行
- this.face.getMsgArea().htmlText+=str.match(this.getPattern())[1]+"<br/>";
后, TextArea 只更新到一半,然后我就设置它的新高度了,所以得到的高度不是最后的调度。
最后向 TextArea 添加函数:
- msgArea.addEventListener(FlexEvent.UPDATE_COMPLETE,textAreaUpdateEvent);
- public function textAreaUpdateEvent(event:FlexEvent):void{
- this.getMsgArea().verticalScrollPosition=this.getMsgArea().maxVerticalScrollPosition;
- }。
后,问题解决。
转自:http://presses.iteye.com/blog/221941
- 面向事件编程(HIM)
- 面向事件编程
- javascript面向对象编程中的事件处理
- 面向过程-事件驱动编程-消息机制【VC MFC】
- VBS 面向对象事件
- js事件:面向对象
- 面向对象写拖拽事件
- 【面向JS--事件】
- 浅谈JSF的两大两点:面向组件编程和事件驱动模式
- 从面向对象编程的角度解析c#中的事件处理机制
- 从面向对象编程的角度解析c#中的事件处理机制
- 从面向对象编程的角度解析c#中的事件处理机制
- Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程
- Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程
- C#数据(文件)校验功能(涉及面向对象编程、多线程、委托、事件的使用)
- 面向对象/面向过程编程
- 面向对象编程 和 面向接口编程
- 面向接口编程,就是面向抽象编程。
- 23种设计模式
- Python datetime模块之datetime
- Add method not implemented
- Session
- Android开发实例:绘制正弦波
- 面向事件编程
- jQuery的自定义动画
- jQuery :root 伪类选择器
- 2016我遇到了什么
- 【Java异常】相关学习笔记
- 安全函数
- 阿里云CentOS安装ActiveMQ详细步骤
- dd大牛的背包九讲-背包问题汇总
- Ajax实现简单的登录验证与帐号注册