命令模式是一种行为型设计模式,它将请求封装成一个对象echo "<br>"
,从而允许我们使用不同的请求、队列或者日志来参数化其他对象。命令模式支持撤销操作。
在命令模式中,有以下几个角色:
- 命令 (Command):定义命令接口,并包含一个执行该命令的方法。
- 具体命令 (Concrete Command):实现命令接口,具体执行某个操作。
echo "<br>"
- 调用者 (Invoker):包含一个命令对象,并在某个时间点调用该命令对象的方法。
- 接收者 (Receiver):包含执行命令所需的代码。
echo "<br>"
适用场景
- 系统需要将请求者和接收者解耦,使得命令发送者不需要知道接收者的实现细节。
- 系统需要支持命令的撤销和恢复操作。
echo "<br>"
- 系统需要将一组操作组合在一起,形成宏命令。
echo "<br>"
优点
- 降低系统 耦合度,使得发送者和接收者完全解耦。
- 容易添加新的命令或者删除旧的命令。
- 支持命令的撤销和恢复操作。
echo "<br>"
- 支持宏命令。
echo "<br>"
缺点
- 可能导致系统中命令的数量剧增。
- 可能引入额外的接口和类。
代码实现
PHP
// 命令接口
interface Command {
public function execute();
}
// 开机命令
class PowerOnCommand implements Command {
private $receiver;
public function __construct(TV $receiver) {
$this->receiver = $receiver;
}
public function execute() {
$this->receiver->powerOn();
}
}
// 关机命令
class PowerOffCommand implements Command {
private $receiver;
public function __construct(TV $receiver) {
$this->receiver = $receiver;
}
public function execute() {
$this->receiver->powerOff();
}
}
// 声音调高命令
class VolumeUpCommand implements Command {
private $receiver;
public function __construct(TV $receiver) {
$this->receiver = $receiver;
}
public function execute() {
$this->receiver->volumeUp();
}
}
// 声音调低命令
class VolumeDownCommand implements Command {
private $receiver;
public function __construct(TV $receiver) {
$this->receiver = $receiver;
}
public function execute() {
$this->receiver->volumeDown();
}
}
// 电视类,接收者
class TV {
public function powerOn() {
echo "电视机开机\n";
}
public function powerOff() {
echo "电视机关机\n";
}
public function volumeUp() {
echo "电视机音量调高\n";
}
public function volumeDown() {
echo "电视机音量调低\n";
}
}
// 遥控器类,调用者
class RemoteControl {
private $onCommand;
private $offCommand;
private $volumeUpCommand;
private $volumeDownCommand;
public function __construct(Command $onCommand, Command $offCommand, Command $volumeUpCommand, Command $volumeDownCommand) {
$this->onCommand = $onCommand;
$this->offCommand = $offCommand;
$this->volumeUpCommand = $volumeUpCommand;
$this->volumeDownCommand = $volumeDownCommand;
}
public function powerOn() {
$this->onCommand->execute();
}
public function powerOff() {
$this->offCommand->execute();
}
public function volumeUp() {
$this->volumeUpCommand->execute();
}
public function volumeDown() {
$this->volumeDownCommand->execute();
}
}
// 客户端
// 创建电视机对象
$tv = new TV();
// 创建命令对象
$powerOnCommand = new PowerOnCommand($tv);
$powerOffCommand = new PowerOffCommand($tv);
$volumeUpCommand = new VolumeUpCommand($tv);
$volumeDownCommand = new VolumeDownCommand($tv);
// 创建遥控器对象
$remoteControl = new RemoteControl($powerOnCommand, $powerOffCommand, $volumeUpCommand, $volumeDownCommand);
// 执行命令操作
$remoteControl->powerOn(); // 电视机开机
$remoteControl->volumeUp(); // 电视机音量调高
$remoteControl->volumeDown(); // 电视机音量调低
$remoteControl->powerOff(); // 电视机关机
Go
// 命令接口
type Command interface {
Execute()
}
// 开机命令
type PowerOnCommand struct {
receiver *TV
}
func (c *PowerOnCommand) Execute() {
c.receiver.PowerOn()
}
// 关机命令
type PowerOffCommand struct {
receiver *TV
}
func (c *PowerOffCommand) Execute() {
c.receiver.PowerOff()
}
// 声音调高命令
type VolumeUpCommand struct {
receiver *TV
}
func (c *VolumeUpCommand) Execute() {
c.receiver.VolumeUp()
}
// 声音调低命令
type VolumeDownCommand struct {
receiver *TV
}
func (c *VolumeDownCommand) Execute() {
c.receiver.VolumeDown()
}
// 电视类,接收者
type TV struct {
}
func (t *TV) PowerOn() {
fmt.Println("电视机开机")
}
func (t *TV) PowerOff() {
fmt.Println("电视机关机")
}
func (t *TV) VolumeUp() {
fmt.Println("电视机音量调高")
}
func (t *TV) VolumeDown() {
fmt.Println("电视机音量调低")
}
// 遥控器类,调用者
type RemoteControl struct {
onCommand Command
offCommand Command
volumeUpCommand Command
volumeDownCommand Command
}
func NewRemoteControl(onCommand, offCommand, volumeUpCommand, volumeDownCommand Command) *RemoteControl {
return &RemoteControl{
onCommand: onCommand,
offCommand: offCommand,
volumeUpCommand: volumeUpCommand,
volumeDownCommand: volumeDownCommand,
}
}
func (r *RemoteControl) PowerOn() {
r.onCommand.Execute()
}
func (r *RemoteControl) PowerOff() {
r.offCommand.Execute()
}
func (r *RemoteControl) VolumeUp() {
r.volumeUpCommand.Execute()
}
func (r *RemoteControl) VolumeDown() {
r.volumeDownCommand.Execute()
}
// 客户端
// 创建电视机对象
tv := &TV{}
// 创建命令对象
powerOnCommand := &PowerOnCommand{receiver: tv}
powerOffCommand := &PowerOffCommand{receiver: tv}
volumeUpCommand := &VolumeUpCommand{receiver: tv}
volumeDownCommand := &VolumeDownCommand{receiver: tv}
// 创建遥控器对象
remoteControl := NewRemoteControl(powerOnCommand, powerOffCommand, volumeUpCommand, volumeDownCommand)
// 执行命令操作
remoteControl.PowerOn() // 电视机开机
remoteControl.VolumeUp() // 电视机音量调高
remoteControl.VolumeDown() // 电视机音量调低
remoteControl.PowerOff() // 电视机关机
Java
// 命令接口
interface Command {
void execute();
}
// 开机命令
class PowerOnCommand implements Command {
private TV receiver;
public PowerOnCommand(TV receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.powerOn();
}
}
// 关机命令
class PowerOffCommand implements Command {
private TV receiver;
public PowerOffCommand(TV receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.powerOff();
}
}
// 声音调高命令
class VolumeUpCommand implements Command {
private TV receiver;
public VolumeUpCommand(TV receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.volumeUp();
}
}
// 声音调低命令
class VolumeDownCommand implements Command {
private TV receiver;
public VolumeDownCommand(TV receiver) {
this.receiver = receiver;
}
public void execute() {
receiver.volumeDown();
}
}
// 电视类,接收者
class TV {
public void powerOn() {
System.out.println("电视机开机");
}
public void powerOff() {
System.out.println("电视机关机");
}
public void volumeUp() {
System.out.println("电视机音量调高");
}
public void volumeDown() {
System.out.println("电视机音量调低");
}
}
// 遥控器类,调用者
class RemoteControl {
private Command onCommand;
private Command offCommand;
private Command volumeUpCommand;
private Command volumeDownCommand;
public RemoteControl(Command onCommand, Command offCommand, Command volumeUpCommand, Command volumeDownCommand) {
this.onCommand = onCommand;
this.offCommand = offCommand;
this.volumeUpCommand = volumeUpCommand;
this.volumeDownCommand = volumeDownCommand;
}
public void powerOn() {
onCommand.execute();
}
public void powerOff() {
offCommand.execute();
}
public void volumeUp() {
volumeUpCommand.execute();
}
public void volumeDown() {
volumeDownCommand.execute();
}
}
// 客户端
// 创建电视机对象
TV tv = new TV();
// 创建命令对象
Command powerOnCommand = new PowerOnCommand(tv);
Command powerOffCommand = new PowerOffCommand(tv);
Command volumeUpCommand = new VolumeUpCommand(tv);
Command volumeDownCommand = new VolumeDownCommand(tv);
// 创建遥控器对象
RemoteControl remoteControl = new RemoteControl(powerOnCommand, powerOffCommand, volumeUpCommand, volumeDownCommand);
// 执行命令操作
remoteControl.powerOn(); // 电视机开机
remoteControl.volumeUp(); // 电视机音量调高
remoteControl.volumeDown(); // 电视机音量调低
remoteControl.powerOff(); // 电视机关机
![在这里插入图片描述](https://img-blog.csdnimg.cn/cc6b09b121e3444babe87bbbbcacaa42.png
doge
精读《设计模式 - Command 命令模式》