<!DOCTYPE html> <html> <head> <title>菜单程序例子</title> </head> <body> <button id="button1">点击按钮1</button> <button id="button2">点击按钮2</button> <button id="button3">点击按钮3</button> </body> <script type="text/javascript"> /* 假设我们正在编写一个用户界面程序,该用户界面上至少有数十个 Button 按钮。因为项目 比较复杂,所以我们决定让某个程序员负责绘制这些按钮,而另外一些程序员则负责编写点击按 钮后的具体行为,这些行为都将被封装在对象里。 在大型项目开发中,这是很正常的分工。对于绘制按钮的程序员来说,他完全不知道某个按 钮未来将用来做什么,可能用来刷新菜单界面,也可能用来增加一些子菜单,他只知道点击这个 按钮会发生某些事情。那么当完成这个按钮的绘制之后,应该如何给它绑定 onclick 事件呢? 我们很快可以找到在这里运用命令模式的理由:点击了按钮之后,必须向某些负责具体行为 的对象发送请求,这些对象就是请求的接收者。但是目前并不知道接收者是什么对象,也不知道 接收者究竟会做什么。此时我们需要借助命令对象的帮助,以便解开按钮和负责具体行为对象之 间的耦合。 设计模式的主题总是把不变的事物和变化的事物分离开来,命令模式也不例外。按下按钮之 后会发生一些事情是不变的,而具体会发生什么事情是可变的。通过 command 对象的帮助,将来 我们可以轻易地改变这种关联,因此也可以在将来再次改变按钮的行为。 */ var button1 = document.getElementById('button1'), button2 = document.getElementById('button2'), button3 = document.getElementById('button3'); // setCommand 函数负责往按钮上面安装命令 var setCommond = function (button, command) { button.onclick = function () { command.execute(); } }; /* 最后,负责编写点击按钮之后的具体行为的程序员总算交上了他们的成果,他们完成了刷新 菜单界面、增加子菜单和删除子菜单这几个功能,这几个功能被分布在 MenuBar 和 SubMenu 这两 个对象中 */ var MenuBar = { refresh: function () { console.log('刷新菜单目录'); } }; var SubMenu = { add: function () { console.log('增加子菜单'); }, del: function () { console.log('删除子菜单'); } } //在让 button 变得有用起来之前,我们要先把这些行为都封装在命令类中 var RefreshMenuBarCommond = function (receiver) { this.receiver = receiver; } RefreshMenuBarCommond.prototype.execute = function () { this.receiver.refresh(); } var AddSubMebuCommond = function (receiver) { this.receiver = receiver; } AddSubMebuCommond.prototype.execute = function () { this.receiver.add(); } var DelSubMenuBarCommond = function (receiver) { this.receiver = this; } DelSubMenuBarCommond.prototype.execute = function () { console.log('删除子菜单'); } var refreshMenuBarCommond = new RefreshMenuBarCommond(MenuBar), addSubMebuCommond = new AddSubMebuCommond(SubMenu), delSubMenuBarCommond = new DelSubMenuBarCommond(SubMenu); setCommond(button1, refreshMenuBarCommond); setCommond(button2, addSubMebuCommond); setCommond(button3, delSubMenuBarCommond); </script> </html>