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的,两个月才产出三个接口。真正优秀的框架应该提供恰到好处的模式实现,既保证扩展性又不失开发效率。下次选框架时,不妨重点看看它的核心模块用了哪些模式,这些模式是否与你的业务增长路径匹配------这比跑分测试更能预见代码的生命力。

相关推荐
阿闽ooo3 天前
中介者模式打造多人聊天室系统
c++·设计模式·中介者模式
小米4963 天前
js设计模式 --- 工厂模式
设计模式
逆境不可逃3 天前
【从零入门23种设计模式08】结构型之组合模式(含电商业务场景)
线性代数·算法·设计模式·职场和发展·矩阵·组合模式
驴儿响叮当20103 天前
设计模式之状态模式
设计模式·状态模式
电子科技圈3 天前
XMOS推动智能音频等媒体处理技术从嵌入式系统转向全新边缘计算
人工智能·mcu·物联网·设计模式·音视频·边缘计算·iot
徐先生 @_@|||3 天前
安装依赖三方exe/msi的软件设计模式
设计模式
希望_睿智4 天前
实战设计模式之访问者模式
c++·设计模式·架构
茶本无香4 天前
设计模式之十六:状态模式(State Pattern)详解 -优雅地管理对象状态,告别繁琐的条件判断
java·设计模式·状态模式
驴儿响叮当20104 天前
设计模式之备忘录模式
设计模式·备忘录模式
驴儿响叮当20104 天前
设计模式之迭代器模式
设计模式·迭代器模式