PHP设计模式之命令模式示例详解

PHP设计模式之命令模式示例详解

命令模式是一种行为型模式,它允许你将请求封装成对象,这样就可以使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持撤销操作,因此被称为可撤销的操作。

示例1: 使用命令模式实现固定长度的文件备份

示例1中,我们将使用命令模式实现固定长度的文件备份。在此示例中,我们将使用一个Command接口来表示备份的命令,并让每个具体的备份命令实现这个接口。在备份管理器中,我们将存储备份命令,并通过管理器执行它们。以下是示例代码:

Command接口

interface Command
{
    public function execute(): void;
}

两种备份命令

// 备份命令1:保存文件前100行
class BackupCommand1 implements Command
{
    private $filename;

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

    public function execute(): void
    {
        $lines = file($this->filename);
        array_splice($lines, 100);
        file_put_contents($this->filename, implode('', $lines));
        echo "备份文件成功!\n";
    }
}

// 备份命令2:保存文件后100行
class BackupCommand2 implements Command
{
    private $filename;

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

    public function execute(): void
    {
        $lines = file($this->filename);
        array_splice($lines, 0, -100);
        file_put_contents($this->filename, implode('', $lines));
        echo "备份文件成功!\n";
    }
}

备份管理器

class BackupManager
{
    private $commands = [];

    public function addCommand(Command $command): void
    {
        $this->commands[] = $command;
    }

    public function executeCommands(): void
    {
        foreach ($this->commands as $command) {
            $command->execute();
        }
    }
}

使用备份管理器

$backupManager = new BackupManager();

// 添加备份命令1
$backupManager->addCommand(new BackupCommand1('/path/to/your/file'));

// 添加备份命令2
$backupManager->addCommand(new BackupCommand2('/path/to/your/file'));

// 执行备份
$backupManager->executeCommands();

在上述示例中,我们创建了两个备份命令,一个保存文件前100行,另一个保存文件后100行。我们使用备份管理器来保存备份命令,并最后执行这些命令。运行示例代码时,你会发现文件已经备份完成,且只保存了前100行或后100行。

示例2: 使用命令模式实现撤销和重做功能

示例2中,我们将再次使用命令模式,这次是为了实现撤销和重做功能。我们将使用一个Command接口以及具体的命令类来表示操作,而撤销和重做功能将由Invoker类处理。以下是示例代码:

Command接口和其具体命令类

interface Command
{
    public function execute(): void;

    public function undo(): void;
}

// 具体的命令类,增加数字
class AddCommand implements Command
{
    private $receiver;

    private $number;

    public function __construct(Receiver $receiver, $number)
    {
        $this->receiver = $receiver;
        $this->number = $number;
    }

    public function execute(): void
    {
        $this->receiver->add($this->number);
    }

    public function undo(): void
    {
        $this->receiver->subtract($this->number);
    }
}

// 具体的命令类,减少数字
class SubtractCommand implements Command
{
    private $receiver;

    private $number;

    public function __construct(Receiver $receiver, $number)
    {
        $this->receiver = $receiver;
        $this->number = $number;
    }

    public function execute(): void
    {
        $this->receiver->subtract($this->number);
    }

    public function undo(): void
    {
        $this->receiver->add($this->number);
    }
}

执行者类

class Receiver
{
    public $number;

    public function __construct()
    {
        $this->number = 0;
    }

    public function add($number): void
    {
        $this->number += $number;
        echo "增加了 $number ,当前数字为 {$this->number}\n";
    }

    public function subtract($number): void
    {
        $this->number -= $number;
        echo "减少了 $number ,当前数字为 {$this->number}\n";
    }
}

Invoker类

class Invoker
{
    private $commands = [];

    private $pointer = 0;

    public function addCommand(Command $command): void
    {
        array_splice($this->commands, $this->pointer);
        $this->pointer = count($this->commands);
        $this->commands[] = $command;
        $command->execute();
    }

    public function undo(): void
    {
        if ($this->pointer === 0) {
            return;
        }

        $command = $this->commands[--$this->pointer];
        $command->undo();
    }

    public function redo(): void
    {
        if ($this->pointer === count($this->commands)) {
            return;
        }

        $command = $this->commands[$this->pointer++];
        $command->execute();
    }
}

使用Invoker类实现撤销/重做

// 创建执行者和命令对象
$receiver = new Receiver();

$addCommand = new AddCommand($receiver, 5);
$subCommand = new SubtractCommand($receiver, 10);

// 创建Invoker对象
$invoker = new Invoker();

// 执行命令
$invoker->addCommand($addCommand);
$invoker->addCommand($subCommand);
$invoker->addCommand($addCommand);

// 撤销和重做
$invoker->undo();
$invoker->undo();
$invoker->redo();
$invoker->redo();

在此示例中,我们使用Invoker类来保存命令对象,并根据用户的使用来执行、撤销和重做。每次执行命令时,我们先将其保存在Invoker中,并执行它。撤销和重做则由Invoker类内部实现。运行示例代码时,可以看到数字被增加,减少,然后又增加,最后进行撤销和重做操作。

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

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • php arsort 数组降序排序详细介绍

    PHP arsort数组降序排序详细介绍 arsort 是 PHP 中的一个数组函数,它可按照值降序排序数组。本文将详细介绍 arsort 函数的使用方法和效果。 语法 arsort 函数的语法如下: arsort (array &$array [, int $sort_flags = SORT_REGULAR ]) 参数说明: $array:必需。…

    PHP 2023年5月26日
    00
  • PHP判断是否微信访问的方法示例

    下面就为您讲解如何使用PHP判断是否为微信访问,完整攻略如下: 1. 通过用户代理字符串判断 首先,在PHP中可以通过$_SERVER变量获取当前访问请求的一些信息,其中就包含了用户代理字符串(User-Agent)信息。微信客户端的User-Agent字符串中会包含“WeChat”关键字,因此可以通过判断User-Agent中是否包含“WeChat”来判断…

    PHP 2023年5月23日
    00
  • PHP+JS实现文件分块上传的示例代码

    以下是关于“PHP+JS实现文件分块上传的示例代码”的完整使用攻略: 基础知识 在使用PHP+JS实现文件分块上传之前,需要掌握一些基础知识,包括PHP语言的基本语法、文件上传的基本原理、JS的基本语法等。以下是一些常见的基础知识: PHP语言的基本语法,包括变量、数组、函数、类等的定义和使用。 文件上传的基本原理,包括HTTP协议、multipart/fo…

    PHP 2023年5月12日
    00
  • GoLang抽奖系统简易实现流程

    下面是详细讲解“GoLang抽奖系统简易实现流程”的完整攻略。 概述 我们将使用Go语言实现一个简单的抽奖系统。这个系统分为三个部分:前端页面、后端接口、数据库。用户可以在前端页面填写信息,并提交抽奖请求。后端接口收到请求后会在数据库中查询这个用户是否有抽奖资格,如果有,则在数据库中标记已经抽奖,并返回抽奖结果给用户。 技术需求 Go语言开发环境 MySQL…

    PHP 2023年5月27日
    00
  • PHP二维数组排序简单实现方法

    PHP二维数组排序是一种常见的操作,相比一维数组排序,其过程会稍微复杂一些。本文将详细讲解如何实现PHP二维数组排序,并提供两条示例说明。 什么是PHP二维数组排序? PHP二维数组排序指的是将一个包含多个数组的数组,按照指定的排序规则进行排序。一般情况下,PHP二维数组排序可以通过指定排序算法和排序依据两个参数来实现。 PHP二维数组排序简单实现方法 下面…

    PHP 2023年5月26日
    00
  • php禁用cookie后session设置方法分析

    下面就为大家详细讲解“php禁用cookie后session设置方法分析”的完整攻略。 什么是Session Session,是指当用户打开一个网站页面后,网站会为该用户在服务器端开辟一块用户数据空间,并将该用户的一些信息存储在此数据空间中。同时,网站会给该用户随机生成一个session id,用于标识该用户的身份信息。这样,用户的请求都会携带session…

    PHP 2023年5月26日
    00
  • 关于简单的php源代码泄露漏洞的发掘

    关于简单的PHP源代码泄露漏洞的发掘,我们可以采取以下步骤: 一、常见的PHP源代码泄露漏洞的发掘方法 1. 利用敏感文件名查找工具 通过一些敏感文件名,如.php、 .inc等等,通过工具对目标站的主机进行扫描,能够快速找到可能存在源代码泄露漏洞的页面。 2. 利用搜索引擎或专门的漏洞扫描工具 通过搜索引擎中输入site:xxx.com等关键字,可以直接搜…

    PHP 2023年5月24日
    00
  • PHP中的闭包(匿名函数)浅析

    PHP中的闭包(匿名函数)浅析 什么是闭包? 闭包(Closures)是匿名函数的一个特殊的应用。匿名函数就是没有名字的函数,闭包则是可以在其被创建的环境外调用的函数。 简单来说,闭包就是定义在某个作用域内的函数,这个函数可以在定义它的作用域外部被调用,并且可以使用其定义时的上下文环境中的变量。 闭包的定义和基本用法 在PHP中,我们可以通过使用 funct…

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