zoukankan      html  css  js  c++  java
  • 命令模式

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

    在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
    命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。

    命令模式包含如下角色:
      Command: 抽象命令类
      ConcreteCommand: 具体命令类
      Invoker: 调用者
      Receiver: 接收者
      Client:客户类

    interface Command{
        function execute();
    }
    //具体命令角色AttackCommand,指定接受者执行攻击命令
    class AttackCommand implements Command{
        private $receiver;
        function __construct(Receiver $receiver){
            $this->receiver = $receiver;
        }
        function execute(){
            $this->receiver->attackAction();
        }
    }
    //具体命令角色DefenseCommand,指定接受者执行防御命令
    class DefenseCommand implements Command{
        private $receiver;
        function __construct(Receiver $receiver){
            $this->receiver = $receiver;
        }
        function execute(){
            $this->receiver->defenseAction();
        }
    }
    //接受者,执行具体命令角色的命令
    class Receiver{
        private $name;
        function __construct($name){
            $this->name = $name;
        }
        function attackAction(){
            echo $this->name."执行了攻击命令";
        }
        function defenseAction(){
            echo $this->name."执行了防御命令";
        }
    }
    //请求者,请求具体命令的执行
    class Invoker{
        private $concreteCommand;
        function __construct($concreteCommand){
            $this->concreteCommand = $concreteCommand;
        }
        function executeCommand(){
            $this->concreteCommand->execute();
        }
    }
    
    //客户端角色
    class Client{
        function __construct(){
            $receiverZhao = new Receiver("赵日天");
            $attackCommand = new AttackCommand($receiverZhao);
            $attackInvoker = new Invoker($attackCommand);
            $attackInvoker->executeCommand();
    
            $receiverYe = new Receiver("叶良辰");
            $defenseCommand = new DefenseCommand($receiverYe);
            $defenseInvoker = new Invoker($defenseCommand);
            $defenseInvoker->executeCommand();
        }
    }
    
  • 相关阅读:
    WSDL
    对协程的理解
    调用webServer
    待看
    BZOJ4668 冷战(并查集)
    BZOJ4651 NOI2016网格(割点)
    Lyft Level 5 Challenge 2018
    BZOJ3073 PA2011Journeys(线段树+bfs)
    BZOJ4602 SDOI2016齿轮(搜索)
    BZOJ4597 SHOI2016随机序列(线段树)
  • 原文地址:https://www.cnblogs.com/paulversion/p/8482544.html
Copyright © 2011-2022 走看看