设计模式之行为型模式—— 3.3 命令模式

<?php
/**
 * 3.3 命令模式
 * 定义:
 *      讲一个请求封装为一个对象,从而是你可用不同的请求对客
 *      户进行参数化;对请求排队或记录日志,以及支持可撤销的
 *      操作。
 * 角色:
 *      1. 抽象Command类
 *          职责:用来声明执行操作的接口。
 *      2. 具体Command类
 *          职责:将一个接收者对象绑定于一个动作,调用接收者
 *                相应的操作,以实现Execute。
 *      3. Invoker类
 *          职责:要求该命令执行这个请求。
 *      4. Receiver类
 *          职责:知道如何实施与执行一个与请求相关的操作,任
 *                何类都可能作为一个接受者。
 * 优点:
 *      1. 它能较容易地设计一个命令队列;
 *      2. 在需要的情况下,可以较容易地将命令记入日志;
 *      3. 允许接收请求的一方决定是否要否决请求;
 *      4. 可以容易的实现对请求的撤销和重做;
 *      5. 因为加进新的具体命令类不影响其他的类,因此增加新
 *         的具体命令类很容易;
 *      6. 把请求一个操作的对象与知道怎么执行一个操作的对象
 *         分隔开。
 * 缺点:
 *      1. 有可能会导致某些系统有过多的具体命令类。因为针对
 *         每一个命令都需要设计一个具体命令类,因此某些系统
 *         需要大量具体命令类,这将影响命令模式的使用。
 * 使用场景:
 *      1. 系统需要将请求调用者和请求接收者解耦,使得调用者
 *         和接收者不直接交互。
 *      2. 系统需要在不同的时间指定请求、将请求排队和执行请
 *         求。
 *      3. 系统需要支持命令的撤销操作和恢复操作。
 *      4. 系统需要将一组操作组合在一起,即支持宏命令。
 *
 */
header(‘content-type:text/html;charset=utf8‘);
//抽象Command类
abstract class Command{
    protected $receiver;
    public function __construct($receiver){
        $this->receiver=$receiver;
    }
    abstract public function execute();
}
//具体Command类
class ConcreteCommand extends Command{
    public function execute(){
        $this->receiver->action();
    }
}
//Invoker类
//此类是用来接收来自客户端的请求,然后将请求转化为命令的执行
//命令执行的动作,最后是由最终的接受者来处理的。
class Invoker{
    private $cmd;
    public function setCommand(Command $cmd){
        $this->cmd=$cmd;
    }
    public function executeCommand(){
        $this->cmd->execute();
    }
}
//Receiver类
class Receiver{
    public function action(){
        echo ‘执行请求‘;
    }
}

//客户端
//请求命令的发起者
$invoker=new Invoker();
//请求命令的最终执行者
$receiver=new Receiver();
//具体的请求
$cmd=new ConcreteCommand($receiver);

//表示要设置并执行哪个请求(命令)
$invoker->setCommand($cmd);
$invoker->executeCommand();
时间: 2024-10-27 19:53:39

设计模式之行为型模式—— 3.3 命令模式的相关文章

设计模式(十四):Command命令模式 -- 行为型模式

1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活. 例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不同操作. 2.问题 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧

JavaScript设计模式与开发实践---读书笔记(9) 命令模式

命令模式的用途: 命令模式是最简单和优雅的模式之一,命令模式中的命令(command)指的是一个执行某些特定事情的指令. 命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系. 命令模式的例子-菜单程序: <!DOCTYPE html> <html lang="en"> <head> <met

设计模式(六)The Command Pattern 命令模式

摘要 命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作 问题引入 近来,智能家居闹得比较凶,这里我们想要实现一个简单的自动家居,由一个遥控器来完成电灯.音响.风扇的开关. 模式定义 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作 认识模式 对于这个模式我最欣赏的就是他将"做什么"与"怎么做"的问题或者说是"动作的请求者

NET设计模式 第二部分 行为型模式(16):命令模式(Command Pattern)

命令模式(Command Pattern) ——.NET设计模式系列之十七 TerryLee,2006年7月 概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠].这就是本文要说的Command模式. 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行

设计模式C#实现(十五)——命令模式

意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 将请求封装成一个对象,客户接受请求参数:可以对请求排队或者记录请求日志,以及可以支持撤销操作 适用性 抽象出待执行的动作以参数化某对象.命令模式是回调机制的一个面向对象的替代品 在不同的时刻指定.排列和执行请求 支持取消操作 支持修改日志 支持事务 结构 实现 使用遥控器,实现对一个灯的远程遥控.灯有开.关两个操作. class Light { public void On() { Console.WriteLine("ligh

【设计模式】 模式PK:命令模式VS策略模式

1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为"算法"已经是一个完整的.不可拆分的原子业务(注意这里是原子业务,而不是原子对象),即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户:而命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色).执行行为(命令角色),让两者相互独立而不相互影响. 我们从一个相同的业务需

(行为型模式五)命令模式

package com.eyugame.modle; /** * 命令模式 * @author JYC506 * */ public class MyCommand implements ICommand{ private Receiver receiver; public MyCommand(Receiver receiver) { super(); this.receiver = receiver; } @Override public void execute() { this.recei

Command模式(C++命令模式)

重新温习GOF23到第19个命令模式了,写下来方便自己理解 用经理,秘书,邮局来理解这个模式还是比较好的. 经理:喂,小丽呀,这儿有封信,请帮我尽快寄出去- 秘书:好的,经理,我马上去办! 秘书拿着这封信,到一家邮局将信寄了出去.邮局最终也将信投递到了收件人手中. 这是一个很常见的生活工作场景,不过这里面:经理.秘书和邮局,三者在不知不觉间,演绎了一出面向对象设计模式:Command模式.Command模式是我打算讲的第一个行为型设计模式. Command模式的内容大致如此: 将一个请求封装成一

《JAVA与模式》之命令模式

命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式的结构 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象. 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作:接收的一方收到请求,并执行操作.命令模式允许请求的一方和接收的一方独立开来,