命令模式:
命令是指执行特定事情的一个指令,在js中,其实高阶函数就是对命令模式的应用,将函数作为参数在整个生命周期中传递,那么函数参数就是个命令指令。
最常见的使用场景是请求者和接收者之间并不知道对方是谁,通过命令(一般是函数)来将彼此之间连接起来。
如果写UI的和js逻辑的是2个人,对于写UI的并不关注比如button的click事件是如何执行的,而只是预留一个onclick事件。
对于写js逻辑的也并不关注UI是如何实现的,只需要实现事件函数执行某种功能,比如点击button弹窗出现,或执行动画等。
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| var dialog = { show() { console.log('show dialog'); } };
var animation = { start() { console.log('show animation'); } };
var setCommand = function(btn, cmd) { btn.onclick = function(){ cmd.run(); }; };
class showDialogCommand { constructor(receiver){ this.receiver = receiver; } run() { this.receiver.show(); } }
class startAnimationCommand { constructor(receiver){ this.receiver = receiver; } run(){ this.receiver.start(); } }
setCommand(btn1, new showDialogCommand(dialog)); setCommand(btn2, new startAnimationCommand(animation));
|
从以上代码可以看出,通过setCommand函数和相关command的类,将点击button显示dialog,开始运行动画等事件和UI分离开来,即写ui的通过setCommand来调用相关的click事件。
当然也可以不采用面向对象的方式来实现,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var dialog = { show() { console.log('show dialog'); } };
var animation = { start() { console.log('show animation'); } };
var btnClick = function(btn, fn) { btn.onclick = fn; };
btnClick(btn1, dialog.show); btnClick(btn2, animation.start);
|