PHP头条
热点:

PHP设计模式漫谈之调解者模式


我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。

同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。

调解者和同事对象
图1 调解者和同事对象

对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(Domain-Driven Design)中的服务就是实体之间的调解者。再举一个PHP相关的例子,Zend_Form装饰和过滤功能实际上可以看作是Zend_Form_Decorator和Zend_Filter实例之间的一个简单调解者,它们都使用Zend_Validate对象进行验证。

当调解者必须监听同事对象的事件时,它通常是作为观察者(Observer)实现的,产生一个黑板(blackboard)对象,一些同事写,另一些同事就读。来自同事的事件被推向调解者,再由调解者将其转发给其它订阅的同事,同事之间不需要相互了解,这个架构成功用于随Zend框架发布的Dojo JavaScript库。这个模式的另一个好处是对象的变化包含在计算方法中,可以通过配置不同的调解者实现这一目标,但实例化相关对象将是一个松散的操作,不同容器和工厂之间的协作关系将是分散的。参与者:

◆同事(Colleague):重点是它的职责,它只与一个调解者Mediator或AbstractMediator通信。

◆调解者(Mediator):协同多个Colleagues(AbstractColleagues)共同工作。

◆AbstractMediator,AbstractColleague:从这些角色的真实实现解耦的可选接口,可能不止一个AbstractColleague角色。

下面的代码实现了一个表单输入的过滤过程,类似于Zend_Form_Element功能。

  1. php
  2. /**
  3. * AbstractColleague.
  4. */
  5. interface Filter
  6. {
  7. public function filter($value);
  8. }
  9. /**
  10. * Colleague. We decide in the implementation phase
  11. * that Colleagues should not know the next Colleague
  12. * in the chain, resorting to a Mediator to link them together.
  13. * This choice succesfully avoids a base abstract class
  14. * for Filters.
  15. * Remember that this is an example: it is not only
  16. * Chain of Responsibility that can be alternatively implemented
  17. * as a Mediator.
  18. */
  19. class TrimFilter implements Filter
  20. {
  21. public function filter($value)
  22. {
  23. return trim($value);
  24. }
  25. }
  1. /**
  2. * Colleague.
  3. */
  4. class NullFilter implements Filter
  5. {
  6. public function filter($value)
  7. {
  8. return $value ? $value : '';
  9. }
  10. }
  11. /**
  12. * Colleague.
  13. */
  14. class HtmlEntitiesFilter implements Filter
  15. {
  16. public function filter($value)
  17. {
  18. return htmlentities($value);
  19. }
  20. }
  1. /**
  2. * The Mediator. We avoid referencing it from ConcreteColleagues
  3. * and so the need for an interface. We leave the implementation
  4. * of a bidirectional channel for the Observer pattern's example.
  5. * This class responsibility is to store the value and coordinate
  6. * filters computation when they have to be applied to the value.
  7. * Filtering responsibilities are obviously a concern of
  8. * the Colleagues, which are Filter implementations.
  9. */
  10. class InputElement
  11. {
  12. protected 我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。

    同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。

    调解者和同事对象
    图1 调解者和同事对象

    对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(Domain-Driven Design)中的服务就是实体之间的调解者。再举一个PHP相关的例子,Zend_Form装饰和过滤功能实际上可以看作是Zend_Form_Decorator和Zend_Filter实例之间的一个简单调解者,它们都使用Zend_Validate对象进行验证。

    当调解者必须监听同事对象的事件时,它通常是作为观察者(Observer)实现的,产生一个黑板(blackboard)对象,一些同事写,另一些同事就读。来自同事的事件被推向调解者,再由调解者将其转发给其它订阅的同事,同事之间不需要相互了解,这个架构成功用于随Zend框架发布的Dojo JavaScript库。这个模式的另一个好处是对象的变化包含在计算方法中,可以通过配置不同的调解者实现这一目标,但实例化相关对象将是一个松散的操作,不同容器和工厂之间的协作关系将是分散的。参与者:

    ◆同事(Colleague):重点是它的职责,它只与一个调解者Mediator或AbstractMediator通信。

    ◆调解者(Mediator):协同多个Colleagues(AbstractColleagues)共同工作。

    ◆AbstractMediator,AbstractColleague:从这些角色的真实实现解耦的可选接口,可能不止一个AbstractColleague角色。

    下面的代码实现了一个表单输入的过滤过程,类似于Zend_Form_Element功能。

    1. php
    2. /**
    3. * AbstractColleague.
    4. */
    5. interface Filter
    6. {
    7. public function filter($value);
    8. }
    9. /**
    10. * Colleague. We decide in the implementation phase
    11. * that Colleagues should not know the next Colleague
    12. * in the chain, resorting to a Mediator to link them together.
    13. * This choice succesfully avoids a base abstract class
    14. * for Filters.
    15. * Remember that this is an example: it is not only
    16. * Chain of Responsibility that can be alternatively implemented
    17. * as a Mediator.
    18. */
    19. class TrimFilter implements Filter
    20. {
    21. public function filter($value)
    22. {
    23. return trim($value);
    24. }
    25. }
    1. /**
    2. * Colleague.
    3. */
    4. class NullFilter implements Filter
    5. {
    6. public function filter($value)
    7. {
    8. return $value ? $value : '';
    9. }
    10. }
    11. /**
    12. * Colleague.
    13. */
    14. class HtmlEntitiesFilter implements Filter
    15. {
    16. public function filter($value)
    17. {
    18. return htmlentities($value);
    19. }
    20. }
    ___FCKpd___2

    原文名:Practical Php Patterns: Mediator 作者:Giorgio

    原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

    filters;
  13. protected 我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充当中间汇聚点。

    同事对象之间应该保持松散耦合,避免一个对象直接明确指向另一个对象。在调解者模式下,对象的关系和依赖发生冲突时,我们可以使用调解者在耦合的对象之间协调工作流,依赖可以从同事朝调解者或从调解者向同事建立,这两个方向上的依赖都可以使用AbstractColleague或AbstractMediator中断。

    调解者和同事对象
    图1 调解者和同事对象

    对象不是孤立的,对象之间必须相互协作才能完成任务。虽然调解者模式可以限制对象之间的相互作用,但如果滥用,会致使编写聚合性类变得非常困难。举一个实用的例子,在领域驱动设计(Domain-Driven Design)中的服务就是实体之间的调解者。再举一个PHP相关的例子,Zend_Form装饰和过滤功能实际上可以看作是Zend_Form_Decorator和Zend_Filter实例之间的一个简单调解者,它们都使用Zend_Validate对象进行验证。

    当调解者必须监听同事对象的事件时,它通常是作为观察者(Observer)实现的,产生一个黑板(blackboard)对象,一些同事写,另一些同事就读。来自同事的事件被推向调解者,再由调解者将其转发给其它订阅的同事,同事之间不需要相互了解,这个架构成功用于随Zend框架发布的Dojo JavaScript库。这个模式的另一个好处是对象的变化包含在计算方法中,可以通过配置不同的调解者实现这一目标,但实例化相关对象将是一个松散的操作,不同容器和工厂之间的协作关系将是分散的。参与者:

    ◆同事(Colleague):重点是它的职责,它只与一个调解者Mediator或AbstractMediator通信。

    ◆调解者(Mediator):协同多个Colleagues(AbstractColleagues)共同工作。

    ◆AbstractMediator,AbstractColleague:从这些角色的真实实现解耦的可选接口,可能不止一个AbstractColleague角色。

    下面的代码实现了一个表单输入的过滤过程,类似于Zend_Form_Element功能。

    1. php
    2. /**
    3. * AbstractColleague.
    4. */
    5. interface Filter
    6. {
    7. public function filter($value);
    8. }
    9. /**
    10. * Colleague. We decide in the implementation phase
    11. * that Colleagues should not know the next Colleague
    12. * in the chain, resorting to a Mediator to link them together.
    13. * This choice succesfully avoids a base abstract class
    14. * for Filters.
    15. * Remember that this is an example: it is not only
    16. * Chain of Responsibility that can be alternatively implemented
    17. * as a Mediator.
    18. */
    19. class TrimFilter implements Filter
    20. {
    21. public function filter($value)
    22. {
    23. return trim($value);
    24. }
    25. }
    1. /**
    2. * Colleague.
    3. */
    4. class NullFilter implements Filter
    5. {
    6. public function filter($value)
    7. {
    8. return $value ? $value : '';
    9. }
    10. }
    11. /**
    12. * Colleague.
    13. */
    14. class HtmlEntitiesFilter implements Filter
    15. {
    16. public function filter($value)
    17. {
    18. return htmlentities($value);
    19. }
    20. }
    ___FCKpd___2

    原文名:Practical Php Patterns: Mediator 作者:Giorgio

    原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

    value;
  14. public function addFilter(Filter $filter)
  15. {
  16. $this->_filters[] = $filter;
  17. return $this;
  18. }
  19. public function setValue($value)
  20. {
  21. $this->_value = $this->_filter($value);
  22. }
  23. protected function _filter($value)
  24. {
  25. foreach ($this->_filters as $filter) {
  26. $value = $filter->filter($value);
  27. }
  28. return $value;
  29. }
  30. public function getValue()
  31. {
  32. return $this->_value;
  33. }
  34. }
  35. $input = new InputElement();
  36. $input->addFilter(new NullFilter())
  37. ->addFilter(new TrimFilter())
  38. ->addFilter(new HtmlEntitiesFilter());
  39. $input->setValue(' You should use the <h1>-<h6> tags for your headings.');
  40. echo $input->getValue(), "\n";

原文名:Practical Php Patterns: Mediator 作者:Giorgio

原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

www.phpzy.comtrue/phpyy/16136.htmlTechArticlePHP设计模式漫谈之调解者模式 我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(Mediator)在同事对象(Colleague)之间充...

相关文章

相关频道:

PHP之友评论

今天推荐