概念与特点
概念:
命令模式指的是执行某些特定事情的指令,或者说实现特定功能的接口约定,其核心思想是将方法的实现者与方法的使用者分离。
特点:
- 将调用操作的对象与实现操作的对象解耦。
- 很适合用于增加、删除等应用场景。
- 命令模式与组合模式结合,将多个不同的命令装配成一个组合命令。
- 命令模式与备忘录模式结合,实现命令的撤销与恢复。
结构与实现
命令模式包含抽象命令、具体命令、实现者和调用者。
抽象命令:声明执行命令的接口,定义执行命令的抽象方法 execute()。
具体命令:实现了抽象命令的方法,拥有实现者对象,调用实现者的功能来完成命令需要的操作。
实现者:具体业务的实现者,比如实现删除或者添加任务。
调用者:通过访问命令对象来执行相关请求,不直接访问实现者。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//删除指令
class Del{
delRecord = new DelRecord();
execute(id){
this.delRecord.action(id);
}
}
//添加指令
class Add{
addRecord = new AddRecord();
execute(name,age){
this.addRecord.action(name,age);
}
}
//组合命令
class DelAndAdd{
del = new Del();
add = new Add();
execute(a,b){
this.del.execute(a);
this.add.execute(b.name,b.age);
}
}
//调用者
class Invoker{
constructor(command){
this.command = command;
}
execute(){
this.command.execute(...arguments);
}
}
//删除记录-业务方法
class DelRecord{
action(id){
console.log('id为'+id+'的记录被删除')
}
}
//添加记录-业务方法
class AddRecord{
action(name,age){
console.log('添加一条记录。姓名为'+name+",年龄为"+age)
}
}
class Customer {
static main() {
//执行删除指令
let invoker1 = new Invoker(new Del());
invoker1.execute(9);
//执行添加指令
let invoker2 = new Invoker(new Add());
invoker2.execute('jack','18');
//执行组合命令
let combine = new DelAndAdd();
combine.execute(10,{
name:'rose',age:'16'})
}
}
Customer.main();
</script>
</body>
</html>
应用场景
- 系统需要将请求调用者与请求接收者解耦时。
- 系统需要随机请求命令或经常增加或删除命令一个类中定义了多种行为,并且这些行为在这个类的操作中以多条件语句的形式出现,可将每个分支移植到具体策略类中代替条件语句。
- 系统需要执行一组操作时,命令模式可组合成宏命令来实现功能。
- 系统需要支持命令的撤销和恢复时。可将命令对象存储起来,采用备忘录模式来实现。
应用实例
暂无。
总结
命令模式非常适合后台管理系统的增删改查。通过命令模式实现功能的调用和实现解耦,有利于功能的维护和拓展。
【命令类】:
1、在构造函数中定义实现者对象,
2、提供 execute 方法,调用实现者的业务方法。
【实现者】:
1、提供 action 方法,处理具体业务逻辑。
【调用者】:
1、在构造函数中设置命令类,提供设置命令的方法。
2、提供 call 方法,执行命令类的 execute 方法。