新手如何命令模式,PHP代码实现是什么
Admin 2022-08-15 群英技术资讯 767 次浏览
这篇文章主要讲解了“新手如何命令模式,PHP代码实现是什么”,文中的讲解内容简单、清晰、详细,对大家学习或是工作可能会有一定的帮助,希望大家阅读完这篇文章能有所收获。下面就请大家跟着小编的思路一起来学习一下吧。命令模式:
命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
模式动机:
在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。
命令模式包含如下角色:
Command: 抽象命令类
ConcreteCommand: 具体命令类
Invoker: 调用者
Receiver: 接收者
Client:客户类
UML类图:

//代码实现:
<?php header("Content-type:text/html;Charset=utf-8"); //命令接口,定义具体命令接口要实现的执行函数 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(); } } //测试: new Client();
模式分析:
命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。
适用性:
抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(call back)函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。Command 模式是回调机制的一个面向对象的替代品。
在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
支持取消操作。Command的Excute 操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command 接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。
支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们。
用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( transaction)的信息系统中很常见。一个事务封装了对数据的一组变动。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是关于PHP枚举类型的管理的内容,下面介绍了几种PHP枚举类型的常见管理方式以及示例,小编觉得是比较实用的,因此分享给大家,下面我们就一起来了解一下吧。
下面由Laravel教程栏目给大家介绍laravel hasManyThrough用法及参数,希望对大家有所帮助!
函数是PHP学习需要掌握的内容,为了让大家更熟悉PHP函数的应用,下面给大家分享基于PHP实现的根据生日计算年龄的代码,对新手有一定的借鉴学习价值,感兴趣的朋友可以参考参考。
这篇文章主要给大家分享的是有关解决laravel数据库迁移报错SQLSTATE[42000]的内容,很多朋友遇到这个问题不知怎么解决,因此分享给大家做个参考,有需要的朋友可以看一下。
运算符是告诉编译程序执行特定算术或逻辑操作的符号,通常与操作数一起构成一个表达式,我们经常看到它会参与数学运算或逻辑运算。PHP也包涵了很多的运算符,这篇文章详细...
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008