浅谈PHP设计模式的命令模式

简介:

命令模式:属于行为型的设计模式。将一个请求封装为一个对象,从而是你可用不同的请求对客户端进行参数化。对请求排队或记录请求日志,以及支持可撤销的操作。

适用场景:

命令发送者 只需要知道发送 请求对象,不需要知道如何完成请求 ;
命令执行者 只需要知道如何 完成请求,不需要知道请求的发送过程 ;

优点:

  1. 封装调用和解耦。
  2. 容易的将数据记录到日志。
  3. 容易的实现对请求的撤销和重做。

缺点:

增加代码复杂性。。

代码:

*/
/**
 * Command接口声明用于执行命令的方法。
 */
interface Command
{
    public function execute(): void;
}

/**
 * 一些命令可以自己实现简单的操作。
 */
class SimpleCommand implements Command
{
    private $payload;

    public function __construct(string $payload)
    {
        $this->payload = $payload;
    }

    public function execute(): void
    {
        echo "SimpleCommand:看,我可以做一些简单的事情,比如打印(" . $this->payload . ")\n";
    }
}

/**
 *然而,有些命令可以将更复杂的操作委派给其他对象,*称为“接收器”
 */
class ComplexCommand implements Command
{
    /**
     * @var Receiver
     */
    private $receiver;

    /**
     * 启动接收器方法所需的上下文数据。
     */
    private $a;

    private $b;

    /**
     *复杂命令可以通过构造函数接受一个或多个接收器对象以及*任何上下文数据。
     */
    public function __construct(Receiver $receiver, string $a, string $b)
    {
        $this->receiver = $receiver;
        $this->a = $a;
        $this->b = $b;
    }

    /**
     * 命令可以委托给接收者的任何方法。
     */
    public function execute(): void
    {
        echo "ComplexCommand:复杂的事情应该由接收器对象完成。\n";
        $this->receiver->doSomething($this->a);
        $this->receiver->doSomethingElse($this->b);
    }
}

/**
 *Receiver类包含一些重要的业务逻辑。他们知道如何执行与执行请求相关的各种操作。事实上,任何类别都可以充当接收方。
 */
class Receiver
{
    public function doSomething(string $a): void
    {
        echo "Receiver: Working on (" . $a . ".)\n";
    }

    public function doSomethingElse(string $b): void
    {
        echo "Receiver: Also working on (" . $b . ".)\n";
    }
}

/**
 *Invoker与一个或多个命令关联。它向*命令发送请求。
 */
class Invoker
{
    /**
     * @var Command
     */
    private $onStart;

    /**
     * @var Command
     */
    private $onFinish;

    /**
     * 初始化命令。
     */
    public function setOnStart(Command $command): void
    {
        $this->onStart = $command;
    }

    public function setOnFinish(Command $command): void
    {
        $this->onFinish = $command;
    }

    /**
     *Invoker不依赖于具体的命令或接收器类。*调用器通过执行*命令将请求间接传递给接收方。
     */
    public function doSomethingImportant(): void
    {
        echo "Invoker: 有人想在我开始之前做点什么吗?\n";
        if ($this->onStart instanceof Command) {
            $this->onStart->execute();
        }

        echo "Invoker: ...做一些非常重要的事情...\n";

        echo "Invoker: 我做完后有人想做什么吗?\n";
        if ($this->onFinish instanceof Command) {
            $this->onFinish->execute();
        }
    }
}

/**
 *客户端代码可以使用任何命令参数化调用程序。
 */
$invoker = new Invoker();
$invoker->setOnStart(new SimpleCommand("你好!"));
$receiver = new Receiver();
$invoker->setOnFinish(new ComplexCommand($receiver, "发送电子邮件", "保存报告"));

$invoker->doSomethingImportant();

原文链接:https://www.cnblogs.com/phpphp/p/17067340.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈PHP设计模式的命令模式 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • PHP代码优化技巧小结

    PHP 代码优化技巧小结 在构建 PHP 应用程序时,优化代码以提高性能是非常重要的。以下是一些 PHP 代码优化技巧: 避免使用全局变量 全局变量在 PHP 中非常容易滥用,但是它们的使用可能会导致性能问题。每次访问全局变量都需要导入全局符号表,这会增加代码执行时间。因此,最好将变量作为函数的参数传递,并尽可能在函数范围内使用它们。 // bad func…

    PHP 2023年5月23日
    00
  • PHP小程序自动提交到自助友情连接

    针对“PHP小程序自动提交到自助友情连接”的完整攻略,我将从以下几个方面进行讲解: 配置友情连接自助提交页面 编写自动提交代码并测试 定时自动提交友情连接 1. 配置友情连接自助提交页面 首先,我们需要为网站配置一个友情连接自助提交页面,让其他站点可以通过该页面提交友情连接信息。一般情况下,我们可以在网站底部添加一个友情链接入口,点击进入该页面即可进行友情链…

    PHP 2023年5月23日
    00
  • 小程序登录之支付宝授权的实现示例

    小程序登录之支付宝授权的实现示例 一、前言 小程序是当前互联网开发的热点之一,用户进入小程序需要登录授权才能使用,而支付宝作为移动支付的龙头,支持用户使用支付宝账号在小程序中进行登录授权,本文将详细介绍小程序登录之支付宝授权的实现示例。 二、示例说明 示例一:小程序登录流程 小程序登录一般分为以下几步: 1.用户进入小程序,点击登录按钮。 2.小程序弹出登录…

    PHP 2023年5月23日
    00
  • 浅谈PHP中类和对象的相关函数

    我将介绍一下PHP中类和对象的相关函数。这里将涉及以下函数: class_exists() get_class() get_called_class() instanceof clone class_exists() PHP函数 class_exists()用于检查类是否已经定义。它与 include() 或 require() 不同,这两个函数只用于在当前…

    PHP 2023年5月27日
    00
  • php通过文件流方式复制文件的方法

    一、什么是文件流 在PHP中,我们使用文件流来操作文件,所谓文件流,是指通过指向文件的指针来进行数据流的读写操作。 二、php通过文件流方式复制文件的方法 PHP中有多种方式可以复制文件,其中一种是通过文件流方式复制,以下是具体步骤: 打开要复制的源文件和目标文件 $source_file = fopen("source.txt", &q…

    PHP 2023年5月26日
    00
  • php数组合并与拆分实例分析

    PHP数组合并与拆分实例分析 在 PHP 中,数组是一种非常常用的数据结构。在实际开发中,我们可能需要合并若干个数组或者将一个数组拆分成若干个小数组。本文将详细介绍 PHP 中如何实现数组的合并与拆分操作,并提供两个实例说明。 数组合并 PHP 提供了多种合并数组的方法,主要有以下几种方式: 1. array_merge 函数 array_merge 函数可…

    PHP 2023年5月26日
    00
  • php代码架构的八点注意事项

    下面是关于“php代码架构的八点注意事项”的完整攻略: 一、结构清晰 代码结构清晰,便于阅读和维护。合理分离各个功能模块,尽量不要在一个文件中混杂多种功能模块的代码,采用面向对象或MVC框架等分层结构方式,便于代码的可读性、扩展性、维护性、可复用性。 例如: <?php class User { public function getUserInfo(…

    PHP 2023年5月24日
    00
  • 在PHP程序中运行Python脚本(接收数据及传参)的方法详解

    下面我将为您详细介绍如何在PHP程序中运行Python脚本,并进行数据传递。 准备工作 在进行下一步操作之前,我们需要确保已经安装好以下环境: PHP 5.4或以上版本 Python 2.7或以上版本 Apache或NGINX等web服务器 步骤一:编写PHP脚本 首先,我们需要在PHP程序中编写相关代码,用于调用Python脚本并向其传递参数以及接收Pyt…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部