日历

September 2020
M T W T F S S
 123456
78910111213
14151617181920
21222324252627
282930  

状态模式与事件驱动

Home Forums 《冒号课堂》讨论区 状态模式与事件驱动

  • This topic is empty.
Viewing 3 reply threads
  • Author
    Posts
    • #1042
      Todd
      Member

      我发现状态模式与事件驱动编程有相通之处,可以把当前状态和事件看做是二维的自变量(state, event),状态模式以state为核心,而事件驱动以event为核心。

      实际项目中,我多用事件驱动,较少用到状态模式。但是发现状态模式和编译原理里面的递归下降分析法很类似,递归下降写出来的程序本质上就是状态模式。

    • #1177
      hui
      Keymaster

      前段时间在外旅游,未能及时答复,非常抱歉。以下是我的回复——

      1.状态与事件可以相互推演——一方面可以把状态看作对事件的响应,另一方面可以把事件看作状态的迁移。从这个角度说,与其说把state与event看作并列的二维变量,不如说把二者看作一种(数学上的)对偶(duality)关系。

      2.状态与事件的确相关,但区别也是很明显的——状态对应的是时间上的一个区间(interval),而事件对应的是时间上的一个(point)。所以“当前状态”的说法很普遍,但“当前事件”的说法比较少见,因为状态是持续性的,而事件是瞬时性的。

      3.事件驱动式的卖点是一个对象可以同时为多个对象传递信息,还能在时间和空间上保持松耦合关系。而状态模式的卖点是在缺乏动态继承机制下实现一个对象状态的演进。

    • #1178
      Todd
      Member

      这几天我了解了一些关于具化(reification)的知识,具化就是把隐式的东西显式化成为语言或设计的一等公民。C/C#/Java中控制流是隐式的,而函数式语言中的continuation就是对控制流的具化。

      不知道事件是否能够看做对系统中隐含的某类信息的具化?

    • #1179
      hui
      Keymaster

      你的理解是有道理的。

      最常见的事件有:signal event、change event、time event和call event。

      signal event中的signal代表一个对象向另一个对象的单向信息;

      change event中的change代表一个被持续估值的Boolean表达式从false变成true;

      time event中的time代表一个绝对时间或相对时间的发生;

      call event中的call代表某个特殊运算的调用。

      通过引入事件机制,这些隐含的信息被显化和语义化,成为对象之间的交互手段。

Viewing 3 reply threads
  • You must be logged in to reply to this topic.
 请您评分1星(很差)2星(不行)3星(一般)4星(不错)5星(很棒)