Skip to content

Latest commit

 

History

39 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LuaGamePattern

Lua 语言实现的经典设计模式与游戏开发常用框架模式集合。每个模式均包含可运行的示例代码,适合学习和在游戏项目中直接引用。

环境要求

  • Lua 5.1+ / LuaJIT 2.0+
  • 无外部依赖,所有代码均可独立运行

设计模式 (DesignPattern)

按照设计模式的功能划分为八大类,共 23 种经典模式:

对象创建型

模式 路径 说明
单例模式 (Singleton) DesignPattern/Singleton 保证类只有一个实例,提供全局访问点
原型模式 (Prototype) DesignPattern/Prototype 通过克隆原型创建新对象,提供云风式 Lua OOP class 实现
工厂模式 (Factory) DesignPattern/Factory 定义创建对象的接口,由子类决定实例化哪个类
抽象工厂模式 (AbstractFactory) DesignPattern/AbstractFactory 创建一系列相关/依赖对象的接口(Apple/Huawei 产品族示例)
建造者模式 (Builder) DesignPattern/Builder 将复杂对象的构建与表示分离

接口适配型

模式 路径 说明
适配器模式 (Adapter) DesignPattern/Adapter 将一个接口转换成客户期望的另一个接口
桥接模式 (Bridge) DesignPattern/Bridge 将抽象与实现分离,使两者可以独立变化(颜色与形状示例)
外观模式 (Facade) DesignPattern/Facade 为子系统提供统一的高层接口

对象去耦型

模式 路径 说明
中介者模式 (Mediator) DesignPattern/Mediator 用中介对象封装一系列对象交互
观察者模式 (Observer) DesignPattern/Observer 定义对象间一对多依赖关系,状态变化时自动通知

抽象集合型

模式 路径 说明
组合模式 (Composite) DesignPattern/Composite 将对象组合成树形结构表示"部分-整体"层次
迭代器模式 (Iterator) DesignPattern/Iterator 提供顺序访问聚合对象中元素的方法,不暴露内部表示

行为扩展型

模式 路径 说明
装饰器模式 (Decorator) DesignPattern/Decorator 动态给对象添加额外职责,比继承更灵活
责任链模式 (ChainOfResponsibility) DesignPattern/ChainOfResponsibility 使多个对象有机会处理请求,避免发送者和接收者耦合
访问者模式 (Visitor) DesignPattern/Visitor 在不改变类的前提下定义作用于元素的新操作(表达式求值示例)

算法封装型

模式 路径 说明
模板方法模式 (Template) DesignPattern/Template 定义算法骨架,将步骤延迟到子类实现(UI 生命周期示例)
策略模式 (Strategy) DesignPattern/Strategy 定义一系列算法,封装起来使它们可互相替换(折扣/满减计价示例)
命令模式 (Command) DesignPattern/Command 将请求封装为对象,支持撤销/重做操作
解释器模式 (Interpreter) DesignPattern/Interpreter 定义语言文法,建立解释器解释句子(算术表达式解析器示例)

对象状态型

模式 路径 说明
状态模式 (State) DesignPattern/State 允许对象在内部状态改变时改变行为(有限状态机示例)
备忘录模式 (Memento) DesignPattern/Memento 在不破坏封装的前提下捕获对象内部状态(存档/读档示例)

性能与对象访问型

模式 路径 说明
享元模式 (Flyweight) DesignPattern/Flyweight 运用共享技术有效支持大量细粒度对象(地图树木示例)
代理模式 (Proxy) DesignPattern/Proxy 为其他对象提供代理以控制对这个对象的访问(图片延迟加载示例)

框架模式 (FrameworkPattern)

游戏开发中常用的架构模式,共 9 种:

模式 路径 说明
有限状态机 (FSM) FrameworkPattern/FSM 基础状态机框架,支持状态切换、进入/更新/离开回调
行为树 (BehaviorTree) FrameworkPattern/BehaviorTree 游戏 AI 行为树,支持 Sequence/Selector/Action/Condition 节点
实体组件系统 (ECS) FrameworkPattern/ECS 数据驱动的 Entity-Component-System 架构
对象池 (ObjectPool) FrameworkPattern/ObjectPool 对象复用池,减少 GC 开销,支持容量上限和预热
消息分发 (MessageDispatch) FrameworkPattern/MessageDispatch 事件派发器,支持 moduleId+eventId 双层键注册
消息通知中心 (NotificationCenter) FrameworkPattern/MessageDispatch 基于名称的消息注册/分发/注销
消息队列 (MessageQueue) FrameworkPattern/MessageQueue FIFO 消息队列,支持 push/pop/count/isEmpty
MVC FrameworkPattern/MVC Model-View-Controller 基础实现
MVVM FrameworkPattern/MVVM Model-View-ViewModel,内置数据绑定库(单向/双向绑定)
PureMVC FrameworkPattern/PureMVC 经典 PureMVC 简化实现,包含 Facade/Model/View/Controller/Proxy/Mediator/Command

代码规范

所有 Lua 文件统一遵循以下编码规范:

  • 使用原生 Lua OOP 风格:setmetatable + __index + .new() 构造函数
  • 方法定义使用冒号语法 :,确保 self 正确传递
  • 模块级变量使用 local,避免全局污染
  • 测试/示例代码包裹在 IIFE(立即执行函数)中
  • 模块通过 return 导出,支持 dofile/require 引入
  • 缩进使用 4 空格

快速开始

运行单个示例

每个模式文件均可独立运行:

lua DesignPattern/Singleton/Singleton.lua
lua DesignPattern/Observer/Observer.lua
lua DesignPattern/Strategy/Strategy.lua

作为模块引入

-- 引入对象池
local ObjectPool = dofile("FrameworkPattern/ObjectPool/ObjectPool.lua")

local pool = ObjectPool.new(
    function() return {x = 0, y = 0} end,  -- 创建函数
    function(obj) obj.x, obj.y = 0, 0 end,  -- 重置函数
    nil, nil, 100                           -- 容量上限 100
)

pool:prewarm(10)           -- 预热 10 个对象
local obj = pool:get()     -- 获取对象
pool:release(obj)          -- 归还对象
pool:clear()               -- 清空池
-- 引入 FSM
local FsmMachine, BaseState = dofile("FrameworkPattern/FSM/FSM.lua")

local IdleState = setmetatable({}, {__index = BaseState})
IdleState.__index = IdleState
function IdleState.new()
    local o = BaseState.new("Idle")
    return setmetatable(o, IdleState)
end
function IdleState:onEnter() print("Enter Idle") end
function IdleState:onLeave() print("Leave Idle") end
function IdleState:onUpdate() print("Update Idle") end

local fsm = FsmMachine.new()
fsm:addState(IdleState.new())
fsm:addInitState(fsm.states.Idle)
fsm:update()
fsm:switch("Move")
-- 引入 MVVM 数据绑定
local MVVM = dofile("FrameworkPattern/MVVM/MVVM.lua")
local model = MVVM.Model.new({hp = 100, name = "Hero"})
local vm = MVVM.ViewModel.new(model)
vm:bindProperty("hp", "hp")
vm:watch("hp", function(newVal, oldVal)
    print("HP changed:", oldVal, "->", newVal)
end)
model:set("hp", 80)  -- 自动触发 watch 回调

测试

运行所有设计模式示例:

for f in DesignPattern/*/*.lua; do echo "--- $f ---"; lua "$f"; done

运行 ECS 示例:

cd FrameworkPattern/ECS && lua test.lua

参考资料

About

游戏设计模式——Lua实现

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages