首页 > 编程语言 >浅谈PHP设计模式的命令模式

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

时间:2023-01-25 21:55:44浏览次数:39  
标签:function PHP 浅谈 void 命令 Command receiver 设计模式 public

简介:

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

适用场景:

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

优点:

  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();

标签:function,PHP,浅谈,void,命令,Command,receiver,设计模式,public
From: https://www.cnblogs.com/phpphp/p/17067340.html

相关文章

  • 基于PHP语言Laravel9+Vue+ElementUI搭建的Web项目框架
    项目介绍一款PHP语言基于Laravel9.x、Vue、ElementUI等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本......
  • PHP语言Laravel9+Layui后台权限管理系统
    项目介绍一款PHP语言基于Laravel9.x、Layui、MySQL等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本着......
  • 基于PHP实现的Laravel9+Vue+ElementUI大数据分析管理系统
    项目介绍一款PHP语言基于Laravel9.x、Vue、ElementUI等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本......
  • PHP语言的Laravel9+Vue+ElementUI开源框架推荐
    项目介绍一款PHP语言基于Laravel9.x、Vue、ElementUI等框架精心打造的一款模块化、插件化、高性能的前后端分离架构敏捷开发框架,可用于快速搭建前后端分离后台管理系统,本......
  • 浅谈SOFAJRaft中的ShutdownHook
    Java程序经常会遇到进程挂掉的情况,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。而在SOFAJ......
  • 浅谈PHP设计模式的组合模式
    简介:组合模式,属于结构型的设计模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式分两种状态......
  • 适合编程初学者的开源云笔记系统(PHP版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。让想学编程的,一个都不落下。上述基本涵盖了当前编程开发所有主流语言。左侧为前端版本:安卓、iOS、鸿蒙......
  • 设计模式-装饰器模式
    装饰器模式:在不改变原有类的基础上,动态增加一些额外功能举例:定义一个简单的人,刚开始只会走路,经过装饰之后,添加一些技能,会骑车...添加装饰类,实现原理构造方法是返回要......
  • php高并发的瓶颈到底在哪
    说php不适合高并发?问过facebook没?虽然facebook用的是编译型的php,叫hphp,可以跑在类似jvm的虚拟机上,叫hhvm。只不过后来php出了7.x版本甚至8.x之后性能大幅提升,性能和faceboo......
  • ThinkPHP v5.0.22 RCE分析
    前言距离上次php审计是在ThinkPHPv5.0.24反序列化漏洞分析,这篇笔记本来在很久之前应该就要写的,但是一直对tp路由还是不够熟悉,个人觉得难度要比反序列化高一些,拖了这么久......