在杰出的贡献模块中发现了哪些设计模式?


10

除了在Drupal核心使用的Presentation-abstraction-control其他模式之外,在更受欢迎的贡献模块(例如Views,CCK和Features)中是否还显着使用了其他设计模式?


2
正如常见问题解答中所报道的那样:“您只能根据遇到的实际问题提出实用,可回答的问题。闲谈,开放式问题会削弱我们网站的实用性,并将其他问题排除在首页之外。”
kiamlaluno

1
不过,这可能是一个不错的社区Wiki主题
Chaulky 2011年

社区Wiki不再用于无法接受的问题或边缘问题。请参阅社区Wiki的未来
kiamlaluno

2
另一方面,我认为这是一个有趣的话题。建议一个更好的问题:“是否存在可以解决问题X的设计模式?”。因为那是解决问题的设计模式的目的,所以不应仅仅为了使用它们而使用它们。
Berdir 2011年

1
@kiamlaluno,我认为这个问题不是无休止的,健谈的或不切实际的,尽管可以说是开放性的。我问这个问题的目的是为了更好地了解我所熟悉的代码中如何使用设计模式。
Matt V.

Answers:


10

一个开始的地方是核心本身和暴露于贡献的模式。-在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)

一种常见的方法是对经纪人或调解人的想法进行一些修改。在这种设计中,一个对象不直接从另一个对象请求信息。取而代之的是,它请求中介对象(可能已经注入到其中)代表它发出这样的请求。尽管这仍然意味着第一个对象必须主动请求信息,但它仅与中介程序对象紧密耦合,而与从其请求信息的无数其他对象紧密耦合。这意味着,如果其他系统发生更改,我们只需要更新中介程序,而不是接触它的每个系统。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.