Command 命令 行为模式,将一个请求封装为一个对象,从而你可以用不同的请求对客户端进行参数化、对请求排队或记录请求日志,以及支持Redo,Undo操作。
PureMVC的Controller 就是用Command模式实现的,Command模式有一下5个元素
1、命令接口
2、具体命令
3、接受者
4、客户
5、调用者
命令接口是命令模式的重要组成部分,它允许鞠勇不同实现的所有命令都使用统一的接口,也就是,命令的调用者不知道命令的具体实现,就像我们开灯或关灯,但是我们并不知道灯的打开和关闭具体是如何实现的 。
以下的例子摘自《Actionscrption 3 设计模式》
最简单的命令接口通常是一个excute()方法,用于运行被请求的操作,代码如下:
ICommand.as
package {
public interface ICommand {
function excute():void;
}
}
这时我们需要定义支持撤销的命令和重做的命令,代码如下:
IUndoableCommand .as
package {
public interface IUndoableCommand extends ICommand {
function undo();
}
}
IRedoableCommand .as
package {
public interface IRedoableCommand extends ICommand {
function redo();
}
}
通常具体的命令需要一个接受者,就是要对他操作的对象,PureMVC的Command要传进一个Notification,通过facade.reciveMediator()来取得一个操作对象。这里我们就在具体构造函数里,传进一个参数来作为操作对象。
RotateColckwiseCommand.as
package {
import flash.display.*;
public class RotateColckwiseCommand implements ICommand {
private var receiver:DisplayObject;
public function RotateColckwiseCommand(receiver:DisplayObject) {
this.receiver = receiver;
}
public function execute():void {
receiver.rotation += 20;
}
}
}
当然也可反向旋转的命令
RotateCounterColckwiseCommand.as
package {
import flash.display.*;
public class RotateCounterColckwiseCommand implements ICommand {
private var receiver:DisplayObject;
public function RotateCounterColckwiseCommand (receiver:DisplayObject) {
this.receiver = receiver;
}
public function execute():void {
receiver.rotation -= 20;
}
}
}
现在来创建一个放大对象的命令
ScaleUpCommand.as
package {
import flash.display.*;
public class ScaleUpCommand implements ICommand {
private var receiver:DisplayObject;
public function ScaleUpCommand (receiver:DisplayObject) {
this.receiver = receiver;
}
public function execute():void {
receiver.scaleX += 0.1;
receiver.scaleY += 0.1;
}
}
}
还有个缩小对象的命令:
ScaleDownCommand .as
package {
import flash.display.*;
public class ScaleDownCommand implements ICommand {
private var receiver:DisplayObject;
public function ScaleDownCommand (receiver:DisplayObject) {
this.receiver = receiver;
}
public function execute():void {
receiver.scaleX -= 0.1;
receiver.scaleY -= 0.1;
}
}
}
............................................