除了在Drupal核心中使用的Presentation-abstraction-control和其他模式之外,在更受欢迎的贡献模块(例如Views,CCK和Features)中是否还显着使用了其他设计模式?
除了在Drupal核心中使用的Presentation-abstraction-control和其他模式之外,在更受欢迎的贡献模块(例如Views,CCK和Features)中是否还显着使用了其他设计模式?
Answers:
一个开始的地方是核心本身和暴露于贡献的模式。-在Drupal Watchdog的文章中可以找到Larry Garfield(Crell)的精彩文章。
观察者,访客和偷窥者
Drupal实际上是建立在Observer和Visitor的双重模式上的,尽管它没有按名称命名。相反,它称它们为钩子。
hook_node_load()
,hook_user_login()
,等等,在本质上,节点和用户观察员。hook_form_alter()
,hook_node_view()
等等本质上是访客。由于Drupal不会区分这两种方式,因此可以将某些挂钩视为两种模式,但原理是相同的。工厂和命令
工厂模式有几种变体,但是它们都归结为相同的想法:一个对象(一个客户端)向另一个对象(一个工厂)请求逻辑的适当实现,但不在乎它是什么。这要由工厂决定。考虑一下该
db_insert()
函数,其重要部分如下所示:function db_insert($table, array $options = array()) { // ... return Database::getConnection($options['target'])->insert($table, $options); }
该
Database::getConnection()
方法是一个工厂,它返回适合此站点的连接对象。Drupal医生的依赖注射
在Drupal 6中,菜单系统被破坏并重写为一个多步骤过程。现在,我们将实现相同的页面回调,如下所示:
function example_menu() { $items['node/%node/example'] = array( 'page callback' => 'example_page', 'page arguments' => array(1), // ... ); return $items; } function example_page($node) { // Do useful stuff here. }
在这种新设置中,菜单路由器变得更加复杂。但是,作为回报,页面回调将获取它所依赖的节点,即注入该节点。这给了我们很多好处。
求助(r)
一种常见的方法是对经纪人或调解人的想法进行一些修改。在这种设计中,一个对象不直接从另一个对象请求信息。取而代之的是,它请求中介对象(可能已经注入到其中)代表它发出这样的请求。尽管这仍然意味着第一个对象必须主动请求信息,但它仅与中介程序对象紧密耦合,而与从其请求信息的无数其他对象紧密耦合。这意味着,如果其他系统发生更改,我们只需要更新中介程序,而不是接触它的每个系统。