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功能。
<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>
<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>
- /**
- * The Mediator. We avoid referencing it from ConcreteColleagues
- * and so the need for an interface. We leave the implementation
- * of a bidirectional channel for the Observer pattern's example.
- * This class responsibility is to store the value and coordinate
- * filters computation when they have to be applied to the value.
- * Filtering responsibilities are obviously a concern of
- * the Colleagues, which are Filter implementations.
- */
- class InputElement
- {
- 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>登录后复制登录后复制<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>登录后复制登录后复制登录后复制___FCKpd___2登录后复制登录后复制原文名:Practical Php Patterns: Mediator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns
filters;- 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>登录后复制登录后复制<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>登录后复制登录后复制登录后复制___FCKpd___2登录后复制登录后复制原文名:Practical Php Patterns: Mediator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns
value;- public function addFilter(Filter $filter)
- {
- $this->_filters[] = $filter;
- return $this;
- }
- public function setValue($value)
- {
- $this->_value = $this->_filter($value);
- }
- protected function _filter($value)
- {
- foreach ($this->_filters as $filter) {
- $value = $filter->filter($value);
- }
- return $value;
- }
- public function getValue()
- {
- return $this->_value;
- }
- }
- $input = new InputElement();
- $input->addFilter(new NullFilter())
- ->addFilter(new TrimFilter())
- ->addFilter(new HtmlEntitiesFilter());
- $input->setValue(' You should use the h1>-h6> tags for your headings.');
- echo $input->getValue(), "\n";
原文名:Practical Php Patterns: Mediator 作者:Giorgio
原文出处:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

微信勿扰模式什么意思如今,随着智能手机的普及和移动互联网的迅猛发展,社交媒体平台已经成为人们日常生活中不可或缺的一部分。而微信作为国内最流行的社交媒体平台之一,几乎每个人都有一个微信账号。我们可以通过微信与朋友、家人、同事进行实时沟通,分享生活中的点滴,了解彼此的近况。然而,在这个时代,我们也不可避免地面临着信息过载和隐私泄露的问题,特别是对于那些需要专注或

长期以来,iOS设备一直能够使用“健康”应用程序跟踪您的睡眠模式等。但是,当您在睡觉时被通知打扰时,这不是很烦人吗?这些通知可能无关紧要,因此在此过程中会扰乱您的睡眠模式。虽然免打扰模式是避免睡觉时分心的好方法,但它可能会导致您错过夜间收到的重要电话和消息。值得庆幸的是,这就是睡眠模式的用武之地。让我们了解更多关于它以及如何在iPhone上使用它的信息。睡眠模式在iPhone上有什么作用睡眠模式是iOS中专用的专注模式,会根据你在“健康”App中的睡眠定时自动激活。它可以帮助您设置闹钟,然后可以

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,已经成为Web应用程序之间数据交换的常用格式。PHP的json_encode()函数可以将数组或对象转换为JSON字符串。本文将介绍如何使用PHP的json_encode()函数,包括语法、参数、返回值以及具体的示例。语法json_encode()函数的语法如下:st

即使在“请勿打扰”模式下接听电话也可能是一种非常烦人的体验。顾名思义,请勿打扰模式可关闭来自邮件、消息等的所有来电通知和警报。您可以按照这些解决方案集进行修复。修复1–启用对焦模式在手机上启用对焦模式。步骤1–从顶部向下滑动以访问控制中心。步骤2–接下来,在手机上启用“对焦模式”。专注模式可在手机上启用“请勿打扰”模式。它不会让您的手机上出现任何来电提醒。修复2–更改对焦模式设置如果对焦模式设置中存在一些问题,则应进行修复。步骤1–打开您的iPhone设置窗口。步骤2–接下来,打开“对焦”模式设

在iPhone15Pro和iPhone15ProMax型号上,Apple推出了一个物理可编程的动作按钮,取代了音量按钮上方的传统响铃/静音开关。可以对操作按钮进行编程以执行几种不同的功能,但是在静音和响铃模式之间切换的能力并没有消失。默认情况下,长按一次操作按钮将使设备静音,按钮的触觉反馈将发出三个脉冲。两款iPhone15Pro机型在状态栏中的时间旁边都会显示一个划掉的铃铛符号,表示静音/静音模式已激活,并且它将一直保持到您再次长按“操作”按钮取消设备静音。如果您倾向于将iPhone置于静音模

记事本++暗模式v8.0没有参数,Notepad++是最有用的文本编辑器。在Windows10上运行的每个应用程序都支持暗模式。您可以命名Web浏览器,例如Chrome、Firefox和MicrosoftEdge。如果您在记事本++上工作,默认的白色背景可能会伤害您的眼睛。开发人员已将暗模式添加到版本8的Notepad++中,这是打开它的方法。为Windows11/10启用记事本++暗模式启动记事本++单击“设置”>“首选项”>“暗模式”选择“启用深色模式”重新启动记

S模式下的窗口旨在通过仅允许从Microsoft应用商店安装应用来提供增强的安全性和性能。虽然此功能有助于防止恶意软件和确保安全的计算环境,但它可能会限制想要从MicrosoftStore以外的源安装应用程序的用户。如果您发现自己处于这种情况并不断问自己如何在Windows10/11中切换出S模式,那么您来对地方了,因为我们将引导您完成如何使用两种不同的方法在Windows10/11中切换出S模式的步骤,确保您可以享受从您选择的任何地方安装应用程序的自由。了解如何在Windows中切换出S模式将

待机模式即将通过iOS17进入iPhone,本指南旨在向您展示如何在iPhone上使用此功能。待机模式是一项突破性功能,可将iPhone转变为动态、始终开启的智能显示屏。当您的iPhone在充电过程中水平侧放时,它会激活待机模式。此模式精美地展示了大量有用的小部件,包括但不限于当前时间、当地天气更新、您喜欢的照片的幻灯片,甚至是音乐播放控件。此模式的一个显着优点是它能够显示通知,允许用户查看和参与通知,而无需完全唤醒他们的iPhone。如何使用待机模式要使待机模式正常运行,iPhone必须运行i
