命令
是一种封装方法调用的方式,命令模式与普通函数不同。它可以用来对方法调用进行参数化处理和传送,经这样处理过的方法调用可以在任何需要的时候执行。它也可以用来消除调用操作的对象和实现操作的对象之间的耦合。
它在创建用户界面时非常有用,特别是在需要不受限制的取消操作的时候。它还可以用来替代回调函数 ,因为它能够提高在对象间传递的操作的模块化程度。
这种模式适合JSP中的ACTION的实现,在一个ACITON中封装多个命令,如果只封装一个就没有多大意思了。
/* AdCommand interface. */
var AdCommand = new Interface('AdCommand', ['execute']);
/* StopAd command class. */
var StopAd = function(adObject) { // implements AdCommand
this.ad = adObject;
};
StopAd.prototype.execute = function() {
this.ad.stop();
};
/* StartAd command class. */
var StartAd = function(adObject) { // implements AdCommand
this.ad = adObject;
};
StartAd.prototype.execute = function() {
this.ad.start();
};
/* Useage. 这种方式后,就把按钮和他需要调用的操作之间解耦了*/
var startCommand = new StartAd(action);
var stopCommand = new StopAd(action);
new UiButton('Start ', startCommand);
new UiButton('Stop ', stopCommand);
/*匿名函数的写法,省略了很多代码*/
function makeStart(adObject) {
return function() {
adObject.start();
};
}
function makeStop(adObject) {
return function() {
adObject.stop();
};
}
/* Implementation code. */
var startCommand = makeStart(ads[i]);
var stopCommand = makeStop(ads[i]);
startCommand();
stopCommand();
多数命令模式都由以下几种角色组成,客户创建命令,调用者执行命令,接收者在命令执行时执行相应的操作。
接口格式
var Command = new Interface('Command', ['execute']);
Interface.ensureImplements(someCommand, Command);
someCommand.execute();
if(typeof someCommand != 'function') {
throw new Error('Command isn't a function');
}
命令对象格式
/* SimpleCommand, a loosely coupled, simple command class. */
var SimpleCommand = function(receiver) { // implements Command
this.receiver = receiver;
};
SimpleCommand.prototype.execute = function() {
this.receiver.action();
};
/* ComplexCommand, a tightly coupled, complex command class. */
var ComplexCommand = function() { // implements Command
this.logger = new Logger();
this.xhrHandler = XhrManager.createXhrHandler();
this.parameters = {};
};
ComplexCommand.prototype = {
setParameter: function(key, value) {
this.parameters[key] = value;
},
execute: function() {
this.logger.log('Executing command');
var postArray = [];
for(var key in this.parameters) {
postArray.push(key + '=' + this.parameters[key]);
}
var postString = postArray.join('&');
this.xhrHandler.request(
'POST',
'script.php',
function() {},
postString
);
}
};
/* GreyAreaCommand, somewhere between simple and complex. */
var GreyAreaCommand = function(recevier) { // implements Command
this.logger = new Logger();
this.receiver = receiver;
};
GreyAreaCommand.prototype.execute = function() {
this.logger.log('Executing command');
this.receiver.prepareAction();
this.receiver.action();
};
var openCommand = new MenuCommand(fileActions.open);
var openMenuItem = new MenuItem('Open', openCommand);
fileMenu.add(openMenuItem);
取消操作
这种操作其实就是把堆栈和excute相反的操作结合使用。
var MoveUp = function(cursor) { // implements ReversibleCommand
this.cursor = cursor;
};
MoveUp.prototype = {
execute: function() {
cursor.move(0, -10);
},
undo: function() {
cursor.move(0, 10);
}
};
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 理论+实操,带你了解多沙箱容器运行时Kuasar
摘要:华为云DTSE技术布道师张天阳结合沙箱容器发展历程,介绍华为云多沙箱容器运行时 Kuasar 项目优势,开启多沙箱容器运行时上手实践体验。 本文分享自华为云社区《理论+实操,带你了解多沙箱容器运行时Kuasar》,作者:华为云社区精选。 本期《多沙箱容器…