替代观察者模式

lua-users home
wiki

这是对观察者模式的一种替代实现,它使用了一种略有不同的用法习惯。

module(..., package.seeall)

-- Register
local function register( self, observer, method )
  local t = {}
  t.o = observer
  t.m = method
  table.insert( self, t )
end

-- Deregister
local function deregister( self, observer, method )
  local i
  local n = #self
  for i = n, 1, -1 do
    if (not observer or self[i].o == observer) and
       (not method   or self[i].m == method)
    then
      table.remove( self, i )
    end
  end
end

-- Notify
local function notify( self, ... )
  local i
  local n = #self
  for i = 1, n do
    self[i].m( self[i].o, ... )
  end
end

-- signal metatable
local mt = {
  __call = function( self, ... )
    self:notify(...)
  end
}

function signal()
  local t = {}
  t.register = register
  t.deregister = deregister
  t.notify = notify
  setmetatable( t, mt )
  return t
end

由于信号现在是显式对象,而不是隐式数据(如字符串),我们使用表语法糖来处理它们。__call 元方法包含了进来,以便我们直接使用信号。

observer = require( "alt_obs" )

alice = {}
function alice:slot( param )
  print( self, param )
end

bob = {}
bob.alert = observer.signal()

bob.alert:register( alice, alice.slot )
bob.alert( "Hi there" )
bob.alert:deregister( alice )
bob.alert( "Hello?" )

-- WilliamBubel


RecentChanges · preferences
编辑 · 历史
最后编辑于 2008年11月16日 晚上10:59 GMT (差异)