《23种设计模式 Lua篇》 - 观察者模式

当观察哨发现入侵者,通知正在上班的警卫。

一、Observer .lua  警卫基类

--/**************************************************************************
--    Copyright:    www.SaintGrail.com
--    Author:     liu jing
---   Date:     2014-08-26
---   Description:  抽象基类
---**************************************************************************/
Observer={}

-- 名称
Observer.name=""

function Observer:new(_o)
   _o = _o  or {}
   setmetatable(_o,self)
   self.__index=self
   return _o
end

-- 动作
function Observer:run()
    print(self.name.."跑起来")
end



二、PoliceObserver.lua 普通警卫(继承至Observer   警卫基类)

--/**************************************************************************
--    Copyright:    www.SaintGrail.com
--    Author:     liu jing
---   Date:     2014-08-26
---   Description:  警察
---**************************************************************************/
require  ("Observer")
-- 继承
PoliceObserver = Observer:new()

-- 重写子类 run 方法
function PoliceObserver:run()
    print(self.name.."Run 2")
end


三、ObservationPost.lua  观察哨类


--/**************************************************************************
--    Copyright:    www.SaintGrail.com
--    Author:     liu jing
---   Date:     2014-08-26
---   Description:  观察哨
---**************************************************************************/
require  ("Observer")

ObservationPost={}


function ObservationPost:new(_o)
   _o = _o  or {}
   setmetatable(_o,self)
   self.__index=self
   return _o
end

--警卫列表 
ObservationPost.ObserverList={}

--增加警卫
function ObservationPost:add(_obs)
    table.insert(self.ObserverList,_obs)
end

--消息通知
function ObservationPost:Notify()
    for k,v in ipairs(self.ObserverList) do 
        local obs=self.ObserverList[k]
        if(k) then
            obs:run()
        end
    end
end




四、main.lua  主函数调用

require  ("PoliceObserver") 
require  ("ObservationPost")
local function main()
    -- 初始化 两个警卫
    local police=PoliceObserver:new()
    police.name="police_1 "
    local police2=PoliceObserver:new()
    police2.name="police_2 "
    --创建观察哨对象
    obs=ObservationPost:new()
    --将警卫添加到观察哨通知列表
    obs:add(police)
    obs:add(police2)
    -- 发现入侵者 通知所有警卫
    obs:Notify()
end
main()

五、输出结果如下

Debugger v1.1.0
Debugger: Trying to connect to 127.0.0.1:10000 ... 
Debugger: Connection succeed.
police_1 Run 2
police_2 Run 2



你可能感兴趣的:(《23种设计模式,Lua篇》)