PHP框架设计模式

(二)

先说单例模式,这玩意儿在框架里简直像空气一样无处不在。数据库连接、缓存处理、配置加载,哪个不是全局唯一实例?但见过有人把业务逻辑也塞进单例的,结果单元测试时各种依赖缠绕得像毛线团。好的框架会把单例控制在基础设施层,比如Laravel的Service Container虽然底层用单例管理实例,但通过依赖注入让业务层无感知,这才是优雅的实现。

(三)

工厂模式在对象创建场景简直是大杀器。记得有次接手个老项目,到处是new MySQL()、new PostgreSQL(),光数据库切换就要改二十多个文件。现在主流框架的ORM模块基本都采用抽象工厂+反射机制,像ThinkPHP的Db类,配置里改个类型就能自动切换不同数据库驱动,连事务处理都不用重写。不过要注意避免过度设计------见过有人在简单业务里套三层工厂接口,那真是把螺丝刀当屠龙刀使。

(四)

观察者模式在事件系统里玩得最溜。用户注册后要发邮件、写日志、更新统计,要是全写在Controller里,代码能膨胀到三屏都滚不完。Yii2的Event类就做得漂亮,用on()方法挂监听器,trigger()触发时还能传数据包。不过这里有个坑:事件命名太随意会导致难以追踪调用链,最好像Symfony那样用常量定义事件名。

(五)

MVC本身其实就是复合模式的典范。但很多人把Model当成数据库表映射,结果业务逻辑全挤在Controller里。看过最离谱的项目里,Controller方法超过800行,还混着SQL查询和HTML拼接。正确的做法应该是用领域模型+Service层,Model只处理数据结构和基础验证,复杂业务交给Domain Service,这样即使哪天要换框架,业务代码也能完整迁移。

(六)

策略模式在处理业务规则时特别管用。比如支付接口要同时支持支付宝、微信、银联,如果在代码里写满if-else,每接入新支付方式就得全量回归测试。用策略模式配合配置数组,就像Laravel的Payment Gateway那样,新支付渠道只需实现统一接口,核心流程根本不用动。不过实际开发中记得要把策略类设计成无状态的,否则并发场景容易出鬼畜问题。

(七)

最后说说装饰器模式。中间件机制本质上就是装饰器链,比如请求验证->权限校验->参数过滤这几个环节,每个环节都能独立替换。但见过有团队在装饰器里搞副作用的,比如在日志装饰器里修改请求参数,这种隐蔽的耦合最让人头疼。好的实践应该像PSR-15规范那样,保证每个中间件都是纯函数式的。

(八)

设计模式不是银弹,用错了比不用更可怕。见过有团队在初创项目里强套DDD的,两个月才产出三个接口。真正优秀的框架应该提供恰到好处的模式实现,既保证扩展性又不失开发效率。下次选框架时,不妨重点看看它的核心模块用了哪些模式,这些模式是否与你的业务增长路径匹配------这比跑分测试更能预见代码的生命力。

相关推荐
折哥的程序人生 · 物流技术专研5 小时前
第2篇:策略模式三大角色拆解与UML
java·设计模式·策略模式·uml·编程入门·行为型模式·扩充系列
Robot_Nav6 小时前
C++ 面试常问问题汇总:基础语法、面向对象、STL、多线程与设计模式
c++·设计模式·面试
XX風7 小时前
设计模式的本质
设计模式
折哥的程序人生 · 物流技术专研17 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
咖啡八杯19 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
饼干哥哥1 天前
Openclaw已死?任何Agent都能用Cli实现AI自主运营跨境电商
设计模式·openai·ai编程
折哥的程序人生 · 物流技术专研1 天前
第4篇:抽象工厂模式——产品族一键创建
java·设计模式·抽象工厂模式·创建型模式·编程进阶·产品族·扩充系列
geovindu2 天前
go: Cascading Failures Pattern
开发语言·后端·设计模式·golang·反模式·级联失效反模式
端庄的战斗机2 天前
javascript 设计模式(文章很长,请自备瓜子,水果和眼药水)
开发语言·javascript·设计模式