Home Backend Development PHP Tutorial PHP设计模式漫谈之调解者模式_PHP

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

Jun 01, 2016 pm 12:20 PM
object model

我们将给大家介绍调解者模式,这个模式的目的是封装一组对象之间的相互作用,防止对象之间相互干扰,调解者(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功能。

<ol class="dp-xml">
<li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li>
<li><span>/**  </span></li>
<li class="alt"><span> * AbstractColleague.  </span></li>
<li><span> */  </span></li>
<li class="alt"><span>interface Filter  </span></li>
<li><span>{  </span></li>
<li class="alt"><span>    public function filter($value);  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li><span>/**  </span></li>
<li class="alt"><span> * Colleague. We decide in the implementation phase  </span></li>
<li><span> * that Colleagues should not know the next Colleague  </span></li>
<li class="alt"><span> * in the chain, resorting to a Mediator to link them together.  </span></li>
<li><span> * This choice succesfully avoids a base abstract class  </span></li>
<li class="alt"><span> * for Filters.  </span></li>
<li><span> * Remember that this is an example: it is not only  </span></li>
<li class="alt"><span> * Chain of Responsibility that can be alternatively implemented  </span></li>
<li><span> * as a Mediator.  </span></li>
<li class="alt"><span> */  </span></li>
<li><span>class TrimFilter implements Filter  </span></li>
<li class="alt"><span>{  </span></li>
<li><span>     public function filter($value)  </span></li>
<li class="alt"><span>     {  </span></li>
<li><span>         return trim($value);  </span></li>
<li class="alt"><span>     }  </span></li>
<li><span>} </span></li>
</ol>
Copy after login
Copy after login
<ol class="dp-xml">
<li class="alt"><span><span>/**  </span></span></li>
<li><span> * Colleague.  </span></li>
<li class="alt"><span> */  </span></li>
<li><span>class NullFilter implements Filter  </span></li>
<li class="alt"><span>{  </span></li>
<li><span>     public function filter($value)  </span></li>
<li class="alt"><span>     {  </span></li>
<li><span>         return $value ? $value : '';  </span></li>
<li class="alt"><span>     }  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li><span>/**  </span></li>
<li class="alt"><span> * Colleague.  </span></li>
<li><span> */  </span></li>
<li class="alt"><span>class HtmlEntitiesFilter implements Filter  </span></li>
<li><span>{  </span></li>
<li class="alt"><span>     public function filter($value)  </span></li>
<li><span>     {  </span></li>
<li class="alt"><span>         return htmlentities($value);  </span></li>
<li><span>     }  </span></li>
<li class="alt"><span>} </span></li>
</ol>
Copy after login
Copy after login
Copy after login
  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功能。

    <ol class="dp-xml">
    <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li>
    <li><span>/**  </span></li>
    <li class="alt"><span> * AbstractColleague.  </span></li>
    <li><span> */  </span></li>
    <li class="alt"><span>interface Filter  </span></li>
    <li><span>{  </span></li>
    <li class="alt"><span>    public function filter($value);  </span></li>
    <li><span>}  </span></li>
    <li class="alt"><span> </span></li>
    <li><span>/**  </span></li>
    <li class="alt"><span> * Colleague. We decide in the implementation phase  </span></li>
    <li><span> * that Colleagues should not know the next Colleague  </span></li>
    <li class="alt"><span> * in the chain, resorting to a Mediator to link them together.  </span></li>
    <li><span> * This choice succesfully avoids a base abstract class  </span></li>
    <li class="alt"><span> * for Filters.  </span></li>
    <li><span> * Remember that this is an example: it is not only  </span></li>
    <li class="alt"><span> * Chain of Responsibility that can be alternatively implemented  </span></li>
    <li><span> * as a Mediator.  </span></li>
    <li class="alt"><span> */  </span></li>
    <li><span>class TrimFilter implements Filter  </span></li>
    <li class="alt"><span>{  </span></li>
    <li><span>     public function filter($value)  </span></li>
    <li class="alt"><span>     {  </span></li>
    <li><span>         return trim($value);  </span></li>
    <li class="alt"><span>     }  </span></li>
    <li><span>} </span></li>
    </ol>
    Copy after login
    Copy after login
    <ol class="dp-xml">
    <li class="alt"><span><span>/**  </span></span></li>
    <li><span> * Colleague.  </span></li>
    <li class="alt"><span> */  </span></li>
    <li><span>class NullFilter implements Filter  </span></li>
    <li class="alt"><span>{  </span></li>
    <li><span>     public function filter($value)  </span></li>
    <li class="alt"><span>     {  </span></li>
    <li><span>         return $value ? $value : '';  </span></li>
    <li class="alt"><span>     }  </span></li>
    <li><span>}  </span></li>
    <li class="alt"><span> </span></li>
    <li><span>/**  </span></li>
    <li class="alt"><span> * Colleague.  </span></li>
    <li><span> */  </span></li>
    <li class="alt"><span>class HtmlEntitiesFilter implements Filter  </span></li>
    <li><span>{  </span></li>
    <li class="alt"><span>     public function filter($value)  </span></li>
    <li><span>     {  </span></li>
    <li class="alt"><span>         return htmlentities($value);  </span></li>
    <li><span>     }  </span></li>
    <li class="alt"><span>} </span></li>
    </ol>
    Copy after login
    Copy after login
    Copy after login
    ___FCKpd___2
    Copy after login
    Copy after login

    原文名: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功能。

    <ol class="dp-xml">
    <li class="alt"><span><strong><font color="#006699"><span class="tag"></span><span class="tag-name">php</span></font></strong><span> </span></span></li>
    <li><span>/**  </span></li>
    <li class="alt"><span> * AbstractColleague.  </span></li>
    <li><span> */  </span></li>
    <li class="alt"><span>interface Filter  </span></li>
    <li><span>{  </span></li>
    <li class="alt"><span>    public function filter($value);  </span></li>
    <li><span>}  </span></li>
    <li class="alt"><span> </span></li>
    <li><span>/**  </span></li>
    <li class="alt"><span> * Colleague. We decide in the implementation phase  </span></li>
    <li><span> * that Colleagues should not know the next Colleague  </span></li>
    <li class="alt"><span> * in the chain, resorting to a Mediator to link them together.  </span></li>
    <li><span> * This choice succesfully avoids a base abstract class  </span></li>
    <li class="alt"><span> * for Filters.  </span></li>
    <li><span> * Remember that this is an example: it is not only  </span></li>
    <li class="alt"><span> * Chain of Responsibility that can be alternatively implemented  </span></li>
    <li><span> * as a Mediator.  </span></li>
    <li class="alt"><span> */  </span></li>
    <li><span>class TrimFilter implements Filter  </span></li>
    <li class="alt"><span>{  </span></li>
    <li><span>     public function filter($value)  </span></li>
    <li class="alt"><span>     {  </span></li>
    <li><span>         return trim($value);  </span></li>
    <li class="alt"><span>     }  </span></li>
    <li><span>} </span></li>
    </ol>
    Copy after login
    Copy after login
    <ol class="dp-xml">
    <li class="alt"><span><span>/**  </span></span></li>
    <li><span> * Colleague.  </span></li>
    <li class="alt"><span> */  </span></li>
    <li><span>class NullFilter implements Filter  </span></li>
    <li class="alt"><span>{  </span></li>
    <li><span>     public function filter($value)  </span></li>
    <li class="alt"><span>     {  </span></li>
    <li><span>         return $value ? $value : '';  </span></li>
    <li class="alt"><span>     }  </span></li>
    <li><span>}  </span></li>
    <li class="alt"><span> </span></li>
    <li><span>/**  </span></li>
    <li class="alt"><span> * Colleague.  </span></li>
    <li><span> */  </span></li>
    <li class="alt"><span>class HtmlEntitiesFilter implements Filter  </span></li>
    <li><span>{  </span></li>
    <li class="alt"><span>     public function filter($value)  </span></li>
    <li><span>     {  </span></li>
    <li class="alt"><span>         return htmlentities($value);  </span></li>
    <li><span>     }  </span></li>
    <li class="alt"><span>} </span></li>
    </ol>
    Copy after login
    Copy after login
    Copy after login
    ___FCKpd___2
    Copy after login
    Copy after login

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

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

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

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

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

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

What does WeChat's Do Not Disturb mode do? What does WeChat's Do Not Disturb mode do? Feb 23, 2024 pm 10:48 PM

What does WeChat Do Not Disturb mode mean? Nowadays, with the popularity of smartphones and the rapid development of mobile Internet, social media platforms have become an indispensable part of people's daily lives. WeChat is one of the most popular social media platforms in China, and almost everyone has a WeChat account. We can communicate with friends, family, and colleagues in real time through WeChat, share moments in our lives, and understand each other’s current situation. However, in this era, we are also inevitably faced with the problems of information overload and privacy leakage, especially for those who need to focus or

What is sleep mode used for on iPhone? What is sleep mode used for on iPhone? Nov 04, 2023 am 11:13 AM

iOS devices have long been able to track your sleep patterns and more using the Health app. But isn’t it annoying when you’re disturbed by notifications while you’re sleeping? These notifications may be irrelevant and therefore disrupt your sleep patterns in the process. While Do Not Disturb mode is a great way to avoid distractions while sleeping, it can cause you to miss important calls and messages you receive during the night. Thankfully, this is where sleep mode comes in. Let’s learn more about it and how to use it on iPhone. What role does sleep mode play on the iPhone? Sleep mode is a dedicated focus mode in iOS that is automatically activated based on your sleep schedule in the "Health" App. It helps you set an alarm and then

Convert an array or object to a JSON string using PHP's json_encode() function Convert an array or object to a JSON string using PHP's json_encode() function Nov 03, 2023 pm 03:30 PM

JSON (JavaScriptObjectNotation) is a lightweight data exchange format that has become a common format for data exchange between web applications. PHP's json_encode() function can convert an array or object into a JSON string. This article will introduce how to use PHP's json_encode() function, including syntax, parameters, return values, and specific examples. Syntax The syntax of the json_encode() function is as follows: st

Do Not Disturb Mode Not Working in iPhone: Fix Do Not Disturb Mode Not Working in iPhone: Fix Apr 24, 2024 pm 04:50 PM

Even answering calls in Do Not Disturb mode can be a very annoying experience. As the name suggests, Do Not Disturb mode turns off all incoming call notifications and alerts from emails, messages, etc. You can follow these solution sets to fix it. Fix 1 – Enable Focus Mode Enable focus mode on your phone. Step 1 – Swipe down from the top to access Control Center. Step 2 – Next, enable “Focus Mode” on your phone. Focus Mode enables Do Not Disturb mode on your phone. It won't cause any incoming call alerts to appear on your phone. Fix 2 – Change Focus Mode Settings If there are some issues in the focus mode settings, you should fix them. Step 1 – Open your iPhone settings window. Step 2 – Next, turn on the Focus mode settings

iPhone 15 Pro: How to get rid of the silent mode symbol in the status bar iPhone 15 Pro: How to get rid of the silent mode symbol in the status bar Sep 24, 2023 pm 10:01 PM

On iPhone 15 Pro and iPhone 15 Pro Max models, Apple introduced a physically programmable action button that replaces the traditional ring/silent switch above the volume buttons. The action button can be programmed to perform several different functions, but the ability to switch between silent and ring modes isn't gone. By default, a long press on the action button will silence the device and the button's tactile feedback will pulse three times. Both iPhone 15 Pro models will display a crossed-out bell symbol next to the time in the status bar to indicate that silent/silent mode is activated, and it will remain so until you long-press the Action button again to unmute the device. If you prefer to put your iPhone in silent mode

How to enable 'Notepad++ Dark Mode' and 'Notepad++ Dark Theme'? How to enable 'Notepad++ Dark Mode' and 'Notepad++ Dark Theme'? Oct 27, 2023 pm 11:17 PM

Notepad++ dark mode v8.0 has no parameters, Notepad++ is the most useful text editor. Every app running on Windows 10 supports dark mode. You can name web browsers such as Chrome, Firefox, and Microsoft Edge. If you work on Notepad++, the default white background may hurt your eyes. Developers have added dark mode to version 8 of Notepad++, here's how to turn it on. Enable Notepad for Windows 11/10 ++ Dark Mode Launch Notepad ++ Click "Settings" > "Preferences" > "Dark Mode" Select "Enable Dark Mode" to restart Notepad

How to leave S mode on Windows 10/11 How to leave S mode on Windows 10/11 Aug 03, 2023 pm 08:17 PM

Windows in S mode is designed to provide enhanced security and performance by only allowing the installation of apps from the Microsoft Store. While this feature helps prevent malware and ensure a secure computing environment, it may limit users who want to install applications from sources other than the Microsoft Store. If you find yourself in this situation and keep asking yourself how to switch out of S mode in Windows 10/11, then you have come to the right place as we will walk you through how to switch out in Windows 10/11 using two different methods Steps to S Mode ensure you can enjoy the freedom of installing apps from anywhere you choose. Learn how to switch out of S mode in Windows

Guide to using standby mode in iOS 17 Guide to using standby mode in iOS 17 Aug 22, 2023 pm 04:01 PM

Standby mode is coming to iPhone with iOS17, and this guide aims to show you how to use this feature on your iPhone. Standby Mode is a breakthrough feature that transforms iPhone into a dynamic, always-on smart display. When your iPhone is laid horizontally on its side during charging, it activates standby mode. This mode beautifully showcases a host of useful widgets, including but not limited to the current time, local weather updates, a slideshow of your favorite photos, and even music playback controls. A significant advantage of this mode is its ability to display notifications, allowing users to view and engage with them without having to fully wake up their iPhone. How to Use Standby Mode For Standby Mode to work properly, your iPhone must be running i

See all articles