首页 后端开发 php教程 PHP设计模式漫谈之命令模式_PHP

PHP设计模式漫谈之命令模式_PHP

Jun 01, 2016 pm 12:20 PM
command 命令 模式 调用

PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和结构模式;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。

如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。

例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。

注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。

PHP设计模式中的命令模式 
PHP设计模式中的命令模式

在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。

参与者:

◆Command(命令):在一个方法调用之上定义一个抽象;

◆ConcreteCommand(具体的命令):一个操作的实现;

◆Invoker(调用者):引用Command实例作为它可用的操作。

下面的代码展示了Validator组件作为Command对象实现的示例:

<ol class="dp-c">
<li class="alt"><span><span><?php  </span></span></span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * The Command abstraction. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> * In this case the implementation must return a result, </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * sometimes it only has side effects. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">interface</font></strong></span><span> Validator  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200">     * The method could have any parameters. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     * @param mixed </font></span> </span></li>
<li><span><span class="comment"><font color="#008200">     * @return boolean </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200">     */</font></span><span> </span></span></li>
<li>
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>);  </span>
</li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200"> * ConcreteCommand. </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li>
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> MoreThanZeroValidator </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> Validator  </span>
</li>
<li class="alt"><span>{  </span></li>
<li>
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>)  </span>
</li>
<li class="alt"><span>    {  </span></li>
<li>
<span>        </span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$value</font></span><span> > 0;  </span>
</li>
<li class="alt"><span>    }  </span></li>
<li><span>}  </span></li>
<li class="alt"><span> </span></li>
<li>
<span class="comment"><font color="#008200">/** </font></span> </li>
<li class="alt"><span><span class="comment"><font color="#008200"> * ConcreteCommand. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> EvenValidator </span><span class="keyword"><strong><font color="#006699">implements</font></strong></span><span> Validator  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword"><strong><font color="#006699">public</font></strong></span><span> </span><span class="keyword"><strong><font color="#006699">function</font></strong></span><span> isValid(</span><span class="vars"><font color="#dd0000">$value</font></span><span>)  </span>
</li>
<li><span>    {  </span></li>
<li class="alt">
<span>        </span><span class="keyword"><strong><font color="#006699">return</font></strong></span><span> </span><span class="vars"><font color="#dd0000">$value</font></span><span> % 2 == 0;  </span>
</li>
<li><span>    }  </span></li>
<li class="alt"><span>}  </span></li>
<li><span> </span></li>
<li class="alt">
<span class="comment"><font color="#008200">/** </font></span> </li>
<li><span><span class="comment"><font color="#008200"> * The Invoker. An implementation could store more than one </font></span> </span></li>
<li class="alt"><span><span class="comment"><font color="#008200"> * Validator if needed. </font></span> </span></li>
<li><span><span class="comment"><font color="#008200"> */</font></span><span> </span></span></li>
<li class="alt">
<span class="keyword"><strong><font color="#006699">class</font></strong></span><span> ArrayProcessor  </span>
</li>
<li><span>{  </span></li>
<li class="alt">
<span>    </span><span class="keyword"><strong><font color="#006699">protected</font></strong></span><span> </span><span class="vars"><font color="#dd0000">PHP设计模式漫谈我们已经连载了四期,我们知道了代理模式、责任链模式和<font color="#0000ff">结构模式</font>;今天我们一起来讨论的是命令模式(Command),命令模式是封装一个通用操作的机制。
<p>如果你熟悉C或PHP,你可能已经遇到过Command,它相当于程序中的:回调(callback)。回调通常使用一个函数指针或数据结构如PHP中的字符串和数组实现,Command是在一个方法调用之上的抽象,它吸收了所有面向对象的好处:合成、继承和处理。</p>
<p>例如,《设计模式》一书推荐使用Command存储用户行为链,以支持撤销和重做操作。</p>
<p>注意PHP 5.3函数编程能力(闭包)可以被当做Command模式的一个本地实现,但为每一个命令层次结构使用抽象数据类型有助于类型安全。</p>
<p style="TEXT-ALIGN: center"><img class="fit-image lazy" src="/static/imghw/default1.png" data-src="http://img.bitscn.com/upimg/allimg/100413/115P52291-0.jpg" onmousewheel="javascript:return big(this)"   style="max-width:90%"  style="max-width:90%" alt="PHP设计模式中的命令模式"  style="max-width:90%" onload="javascript:if(this.width>498)this.style.width=498;" border="0"> <br><strong><span style="FONT-SIZE: smaller"><font size="2">PHP设计模式中的命令模式</font></span></strong></p>
<p>在这个模式中,Invoker(调用者)知道传递给它的Command,无需依赖于真实的ConcreteCommand(具体的命令)实现,解决了通过配置进行方法调用相关的问题,如UI控件按钮和菜单等引用一个Command,它们的行为是通过通用的ConcreteCommand实例呈现的。</p>
<p><strong>参与者:</strong></p>
<p>◆Command(命令):在一个方法调用之上定义一个抽象;</p>
<p>◆ConcreteCommand(具体的命令):一个操作的实现;</p>
<p>◆Invoker(调用者):引用Command实例作为它可用的操作。</p>
<p>下面的代码展示了Validator组件作为Command对象实现的示例:</p>
<pre class="brush:php;toolbar:false">___FCKpd___0
登录后复制

使用PHP设计模式中的命令模式的一些注意事项:

◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

rule;  
  •  
  •     public function __construct (Validator $rule)  
  •     {  
  •         $this->_rule = $rule;  
  •     }  
  •  
  •     public function process(array $numbers)  
  •     {  
  •         foreach ($numbers as $n) {  
  •             if ($this->_rule->IsValid($n)) {  
  •                 echo $n"\n";  
  •             }  
  •         }  
  •     }  
  • }  
  •  
  • // Client code  
  • $processor = new ArrayProcessor(new EvenValidator());  
  • $processor->process(array(1, 20, 18, 5, 0, 31, 42)); 
  • 使用PHP设计模式中的命令模式的一些注意事项:

    ◆方法调用中的某些参数可以在构造ConcreteCommand时提供,有效地局部套用(currying)原始函数;

    ◆一个Command可以被看作是一个非常简单的只有一个方法的策略(Strategy),重点放在对象的操作上;

    ◆ConcreteCommands也要组织它们需要的每一个资源,以实现它们的目标,主要是行为的Receiver(接受者),它们调用方法执行一个Command;

    ◆复合模式,装饰模式和其它模式都可以和命令模式组合,获得更多的Command,装饰Command等等。

    本站声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

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

    AI Clothes Remover

    AI Clothes Remover

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

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    微信的免打扰模式有什么作用 微信的免打扰模式有什么作用 Feb 23, 2024 pm 10:48 PM

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

    如何在Windows 11/10中运行SUDO命令 如何在Windows 11/10中运行SUDO命令 Mar 09, 2024 am 09:50 AM

    通过sudo命令,用户可以在提升权限模式下运行命令,而无需切换到超级用户模式。本文将介绍如何在Windows系统中模拟类似于sudo命令的功能。什么是数道司令部?Sudo(“超级用户do”的缩写)是一种命令行工具,允许基于Unix的操作系统(如Linux和MacOS)的用户以提升的权限执行命令,这些权限通常是管理员所拥有的。在Windows11/10中运行SUDO命令然而,随着最新发布的Windows11Insider预览版推出,Windows用户现在也可以体验到这一项功能。这一新功能使用户能够

    win11网卡mac地址怎么查? Win11使用命令获取网卡MAC地址方法 win11网卡mac地址怎么查? Win11使用命令获取网卡MAC地址方法 Feb 29, 2024 pm 04:34 PM

    本文将向读者介绍在Win11系统中如何使用命令提示符(CommandPrompt)来查找网络适配器的物理地址(MAC地址)。MAC地址是网络接口卡(NIC)的唯一标识符,它在网络通信中扮演着重要角色。通过命令提示符,用户可以轻松地获取到当前计算机上所有网络适配器的MAC地址信息,这对于网络故障排查、配置网络设置等任务非常有帮助。方法一:使用「命令提示符」1、按【Win+X】组合键,或【右键】点击任务栏上的【Windows徽标】,在打开的菜单项中,选择【运行】;2、运行窗口,输入【cmd】命令,然

    hyperv增强会话模式在哪? Win11用命令启用或禁用Hyper-V增强会话模式技巧 hyperv增强会话模式在哪? Win11用命令启用或禁用Hyper-V增强会话模式技巧 Feb 29, 2024 pm 05:52 PM

    Win11系统中,可以通过命令来启用或禁用Hyper-V增强会话模式。本文将介绍如何使用命令来进行操作,帮助用户更好地管理和控制系统中的Hyper-V功能。Hyper-V是Microsoft提供的一种虚拟化技术,它内置在WindowsServer和Windows10、11(家庭版除外)中,允许用户在Windows系统中运行虚拟操作系统。虽然虚拟机与宿主机操作系统相隔离,但通过设置,它们依然能够使用宿主机的资源,如声卡和存储设备等。其中一个关键设置就是启用「增强会话模式」。增强会话模式是Hyper

    超实用!让你成为Linux大神的Sar命令 超实用!让你成为Linux大神的Sar命令 Mar 01, 2024 am 08:01 AM

    一、概述sar命令通过从系统活动中收集的数据来展示系统的使用情况报告。这些报告由不同部分组成,每个部分都包含数据类型和收集数据的时间。sar命令的默认模式显示访问CPU的各种资源(如用户、系统、I/O调度等)在不同时间增量下的CPU使用率。此外,它还显示给定时间段内空闲CPU的百分比。报告底部列出了每个数据点的平均值。sar默认每10分钟报告一次收集的数据,但您可以使用各种选项来筛选和调整这些报告。与uptime命令类似,sar命令也可帮助您监测CPU的负载情况。通过sar,您可以了解过度负载发

    请勿打扰模式在iPhone中不起作用:修复 请勿打扰模式在iPhone中不起作用:修复 Apr 24, 2024 pm 04:50 PM

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

    Linux中的神器:eventfd的原理与应用 Linux中的神器:eventfd的原理与应用 Feb 13, 2024 pm 08:30 PM

    Linux是一个强大的操作系统,它提供了许多高效的进程间通信机制,如管道、信号、消息队列、共享内存等。但是,有没有一种更简单、更灵活、更高效的通信方式呢?答案是有的,那就是eventfd。eventfd是Linux2.6版本引入的一种系统调用,它可以用来实现事件通知,也就是通过一个文件描述符来传递事件。eventfd包含一个由内核维护的64位无符号整型计数器,进程可以通过对这个文件描述符进行read/write来读取/改变计数器的值,从而实现进程间通信。eventfd有什么优点呢?它有以下几个特

    Linux 重启服务的正确方式是什么? Linux 重启服务的正确方式是什么? Mar 15, 2024 am 09:09 AM

    Linux重启服务的正确方式是什么?在使用Linux系统时,经常会遇到需要重启某个服务的情况,但是有时候我们可能会在重启服务时遇到一些问题,比如服务没有真正停止或启动等情况。因此,掌握正确的重启服务的方式是非常重要的。在Linux中,通常可以使用systemctl命令来管理系统服务。systemctl命令是systemd系统管理器的一部分

    See all articles