摘要
本文以主流的MVC框架为例,比如Java 的SSH、PHP的Symfony和Zend Framework ,在简单地剖析他们的设计原理之后,找到其中使用的设计模式;鉴赏他们的代码实现,查看设计者们都遵守了哪些软件设计原则。作此文,一为学习,二为总结。其中下面所写内容可能并不全面,也可能不准确,但会不断修改完善。
框架模式
MVC 模式
- y = f (x)
- View/Response = Controller (Model, Request)
Active Record 模式
- Yii Active Record
- Ruby on Rails Active Record
ORM 模式
- PHP 的 Doctorine
- Java 的 Hibernate
三/四层架构,3/4-tier Architecture
- MVC 框架会借鉴三/四层架构的分层思想,对整个系统进行分层,最常见的是在 Model 层中再细分层次。
- SSH 的 DAO/JavaBean、Service、Response 等
- Symfony 2 的 Doctrine、Service、view 等
设计模式的使用
前端控制器,Frontend Controller Pattern
拦截过滤器模式,Intercepting Filter Pattern
复合模式,Compound Pattern
- MVC框架如果不使用复合模式,本文也没有任何意义了
单例模式,Singleton Pattern
- Controller 、 Context、 View 等框架核心类使用了单例模式
多例模式,Multition Pattern
- 各类资源池、进程池、线程池(PHP 的后面两个用不上)
策略模式,Strategy Pattern
代理模式,Proxy Pattern
- 抽象类的使用
工厂模式,Factory Methond Pattern
Action 对象的创建
抽象工厂模式,Abstract Factory Pattern
- ajxaAction 、 WebAction 、 APIAction 以及 ajax和web组合的Action 或者 ajax和API组合的Action,复杂的框架会使用抽象工厂模式
门面模式,Facade Pattern
Logger 类,将第三方开源Logger类封装统一接口,将第三方 Logger 繁冗接口屏蔽
适配器模式,Adapter Pattern
- Zend Framework 的 Zend_Db_Adapter 类,将具体不同的数据库(Mysql、Oracle、SQLite)类接口通过Driver类封装,为上层提供统一接口
- Zend_Cache 对不同cache的接口的再次封装
模版模式,Template Method Pattern
- 各种复杂逻辑的抽象类
- 框架的扩展类
建造者模式,Builder Pattern
- 依赖注入原则的遵守和实践,将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
- Content 对象的创建者是 Controller
- Config 对象的创建
- ORM 的 Object 对象创建
桥梁模式,Bridge Pattern
命令模式,Command Pattern
- Http 请求的解析就是命令模式
- Symfony 2 的 Console
- Symfony 2 的 Command 类
装饰模式,Decorator Pattern
- ajxaAction 、 WebAction 、 APIAction 以及 ajax和web组合的Action 或者 ajax和API组合的Action
迭代器模式,Iterator Pattern
- 路由设置的遍历
组合模式,Composite Pattern
观察者模式,Observer Pattern
- 各种 Trigger 类
- 各类自定义的扩展
责任链模式,Chain of Responsibility Pattern
- 路由的解析,尤其是Restful风格的URL,依据路由表(责任链),定位Action 类和方法
访问者模式,Visitor Pattern
状态模式,State Patter
原型模式,Prototype Pattern
- Action 中,讲执行权移交给另外一个 Action ,比如redirect 或者 forward,获得执行的Action还要和原有Action的属性、状态、上下文一致。原型模式是比较好的选择。
中介者模式,Mediator Pattern
- 充当中介者的类是 Context,某些框架Context类,为Request、Respose、GlobalConfig 等等单例类进行抽象,为业务代码提供唯一的调用方式,即Context的类提供的接口
解释器模式,Interpreter Pattern
亨元模式,Flyweight Pattern
- 通用状态类
- 各种 Util 类
- HTTP meta 类、特殊字符享元归类
备忘录模式,Memento Pattern
- 系统日志、状态,以支持回滚
- 数据库事务
软件设计原则 SOLID
单一职责原则(Simple responsibility pinciple SRP)
开-闭原则(Open-Closed Principle, OCP)
里氏代换原则(Liskov Substitution Principle,LSP)
迪米特法则(Law of Demeter LoD),最少知识原则(Least Knowledge Principle,LKP)
接口隔离原则(Interface Segregation Principle, ISP)
依赖倒置原则(Dependence Inversion Principle)
- 建造者模式的使用
- 路由表的使用,或其他各种配置都收集到配置文件中,使用依赖注入容器,实现代码和实现的解耦