生活中的推模型与拉模型
今天早晨上班走过天桥的时候,有XX快餐店的员工正在桥上发传单。虽然发传单一件很平常的事,平常到你每天都会至少碰到一两次。不过,不知道大家有没有注意到,发传单大致有两种方式:塞与取。前者,往往在你经过的时候,迎面向你走过来,将广告传单塞到你的面前;而后者,则像一个超市里的货架一样,站在原地,手里放着广告传单,等你自己去取。
这两种方式与编程知识的推拉模型很相似。如果你对这个两个概念非常熟悉的话,建议您不要浪费时间往下看了,因为,本文不会就此提出什么精辟、独到的观点。本文旨在用比喻的方式去,给不太明白或未接触过以上概念的同志作个介绍,以方便理解。
推模型和拉模型在编程中实在是很常见,比如设计模式(Design Pattern)里的观察者模式(Observation)中就有用到,在用SAX方法解释XML时,也用到这两种模型。
所谓的推模型和拉模型是编程里面的两种实现方法。例如,大家在编程中可能会经常遇到需要对某个状态、变量、对象或资源进行监听,并在其发生变化时做出反应的情况。要实现满足这个需求,最常用的方法有两种。
第一种方法是通过回调(Callback)实现。定义一个函数,并且在其中编写变化处理语句,然后将其指针传递给被监听对象,在被监听对象发生变化后,对其进行调用。如下面的伪代码所示:
Function OnChanged( ChangedTo )
Log “Object has been changed to “ + ChangedTo
End Function
Function ChangedObject(OnChanged)
Object = “New Object”
OnChanged(Object)
End Function
Function Main()
ChangedObject(OnChanged)
End Funtion这种方法是最常用的方法,也即是所谓的事件驱动编程(Event-driven programming),也就是推模型。就像第一段塞传单的方式,对象发生变化后,主动向塞一些消息、参数等(相当传单),你用编写好的处理函数去接收、处理(接到传单后,你可以看一下、直接扔掉或先看一下再扔掉)。
第二种方法就是通过轮询(Loop check)实现。你不断循环去获得被监听对象的状态,在其改变后执行相应语句。如下面的伪代码所示:
Function ChangedObject(OnChanged)
Object = “New Object”
Object is changed
End Function
Function Main()
Loop
If Obect is changed
Log “Object has been changed to “ + ChangedTo
End If
End Loop
End Function这种方法就是拉模型。相当于第一段所提及的取传单。你获取被监听对象的状态(传单),然后做出反应(你瞄了一下后,或扔掉、或保留)。
总结,希望上面的描述不会另大家更迷惑。
浙公网安备 33010602011771号