设计模式之命令模式,golang,php实现

程序员卷不动了 2023-03-18 PM 353℃ 0条

命令模式是一种行为型设计模式。它将请求的发送者和接收者解耦,并且支持撤销和恢复操作。在命令模式中,请求被封装成一个命令对象,并在命令对象中封装了执行命令所需要的必要信息,如被调用的方法、方法参数等。

命令模式中通常有四个主要角色:

  1. 请求者(Invoker):请求发送者,负责发送命令请求。
  2. 命令接口(Command):定义命令的接口。
  3. 具体命令(Concrete Command):实现命令接口,保存命令的执行信息,如接收者、方法名、方法参数等。
  4. 接收者(Receiver):实现了真正完成命令操作的方法。

命令模式将请求者和接收者分离开来,通过命令对象封装请求,让接收者独立于请求者发送命令。这样就可以轻松地添加、修改和删除命令。

golang实现代码:

package main

import "fmt"

// 定义命令接口
type Command interface {
    Execute()
}

// 创建命令结构体
type ConcreteCommand struct {
    receiver Receiver
}

func (cc *ConcreteCommand) Execute() {
    cc.receiver.Action()
}

// 实现接收器
type Receiver struct{}

func (r *Receiver) Action() {
    fmt.Println("Action performed!")
}

// 创建Invoker结构体
type Invoker struct {
    commands []Command
}

func (i *Invoker) StoreCommand(command Command) {
    i.commands = append(i.commands, command)
}

func (i *Invoker) ExecuteCommands() {
    for _, command := range i.commands {
        command.Execute()
    }
}

func main() {
    invoker := Invoker{}

    // 创建接收器
    receiver := Receiver{}

    // 创建具体的命令对象及其依赖
    command := &ConcreteCommand{receiver}

    // 存储并执行命令
    invoker.StoreCommand(command)
    invoker.ExecuteCommands()
}

php实现代码:

// 定义一个命令接口
interface Command {
    public function execute();
}

// 创建一个具体的命令类
class ConcreteCommand implements Command {
    private $receiver;

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

    public function execute() {
        $this->receiver->action();
    }
}

// 创建一个接收者类
class Receiver {
    public function action() {
        echo "Receiver: Executing action.<br>";
    }
}

// 创建一个调用者类
class Invoker {
    private $commands = [];

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

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

// 客户端代码
$invoker = new Invoker();

// 创建接收者
$receiver = new Receiver();

// 创建具体的命令对象及其依赖
$command = new ConcreteCommand($receiver);

// 存储并执行命令
$invoker->storeCommand($command);
$invoker->executeCommands();

我们首先定义了一个 Command 接口,并在 ConcreteCommand 中实现了该接口,该类包含了一个作为依赖关系的 Receiver 对象。然后,我们定义了 Receiver 类来实现请求的真正行为。最后,我们定义了 Invoker 类来存储和执行命令。在客户端代码中,我们首先创建了一个 Invoker,然后创建了一个 Receiver 和一个 ConcreteCommand 对象,并将其存储在 Invoker 中。最后,我们执行存储在 Invoker 中的所有命令,这里只有一个命令。

输出:

Receiver: Executing action.
标签: 设计模式

非特殊说明,本博所有文章均为博主原创。

评论啦~