命令模式主要对操作和具体的实现进行解耦。我们只需告诉系统我们需要什么操作,而不关心具体是怎么怎么实现了这个操作。这样当我们需要修改对外的接口时也不会影响用户的功能。
<!DOCTYPE HTML>
<html style="height: 100%">
<head>
<meta charset="utf-8">
</head>
<body style="height: 100%">
<!--<script type="text/javascript" src="jquery-2.2.3-unzip.js">-->
</script>
<script type="text/javascript" >
var sqlOperation={
id:0,//数据唯一索引
db:{},//数据存储对象
argumentsConfig:{select:1,add:1,delete:1},//配置没种操作的参数个数
methodConfig:{select:"query"},//把旧的接口改成新的接口名,通过配置我们不需要改变对外的接口
add:function(data){
this.db[++this.id]=data;
return this.id;
},
delete:function(id){
if(id=="all"){
this.db={};
return;
}
this.db[id] && delete this.db[id];
},
/*
select:function(id){
if(id=="all"){
console.log(this.db);
}
else{
console.log(this.db[id])
}
},
*/
query:function(id){
if(id=="all"){
console.log(this.db);
}
else{
console.log(this.db[id])
}
},
execute:function(cmd){
var needNum=this.argumentsConfig[cmd];//获取操作所需的操作数个数
var realArg=Array.prototype.slice.call(arguments,1);//获取用户实际传进来的参数个数
if(needNum ^ realArg.length){//异或比较,如果参数个数不一样则返回1,if成立给用户返回false
return false;
}
var method=this.methodConfig[cmd];
//1,查看接口名有没有修改过,如果有的话判断新的接口名是否存在,存在的话就直接调用,调用完毕通过设置1保证后面的代码不会执行.
//2.如果method或者this[method]为假,则直接调用this[cmd].apply(this,realArg)
(method && this[method] && (this[method].apply(this,realArg) || 1)) || this[cmd].apply(this,realArg)
}
}
sqlOperation.execute("add","sasasa");
sqlOperation.execute("add","sasasa");
sqlOperation.execute("add","sasasa");
sqlOperation.execute("delete",1);
sqlOperation.execute("select","all");
</script>
</html>
以上代码实现了一个简单的及时数据库功能,利用命令行模式,用户永远可以使用唯一的接口execute执行add,delete,select命令,而不用关心最后具体调用的接口。我们可以在具体的代码实现中随便改动而不影响用户的操作,否则,如果我们对外提供的是add,delete等接口,如果有一天我们需要改这个接口的名字,那会导致用户所有用到该接口的代码都需要修改。