每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题。思想是相通的。只不过不同的设计语言有其特定的实现。对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用。只不过没有对应起来罢了。本文就力求以精简的语言去介绍下设计模式这个高大上的概念。相信会在看完某个设计模式之后有原来如此的感慨。

  一、基本概念与使用场景:

  基本概念:

  将请求封装成对象,分离命令接受者和发起者之间的耦合。 命令执行之前在执行对象中传入接受者。主要目的相互之间的解耦。简单而言分为三个对象,

  1、发起者:发出调用命令即可,具体如何执行,谁执行并不需要清楚。

   2、接受者:有对应的接口处理不同的命令,至于命令是什么,谁发出的,不用关心

  3、命令对象:上面讲发起者和接受者分开了,二者之间需要个连接桥梁。这就是命令对象。命令对象接受发送者的调用,然后调用接受者的相应接口。

  下面有个简单的图表示下三者关系(忽略画图技术,要透过现象看本质):

    

  使用场景: 发布一些命令,但不清楚接受者和请求的操作。命令是指执行某些事情的指令。即只用知道发布了一个指令就行,具体做什么谁来做不用关心。其实是回调函数面向对象的替代品。最常见的例子就是事件绑定了

  二、实例:

    可能看了上面的内容大家还是感到有点迷糊,当然了只看理论其实很难理解一个东西的。我们下面举个栗子:

    场景如下:有个按钮button,点击之后,调用menu对象的refresh方法,输出‘refresh’的内容。    

 1 /***
2 * 非命令模式的绑定事件,就不严谨的鞋全部代码了
3 *
4 */
5 button.onClick(function (e) {
6 var menu = {
7 refresh: function () {
8 /**
9 * 执行命令,
10 */
11 console.log('refresh')
12 }
13 }
14 /**
15 * 发出命令
16 */
17 menu.refresh()
18 })
19 /**
20 * 触发事件
21 */
22 button.trigger('click')

   这样写应该是常用的的写法,当然menu对象在哪里定义就随心情了,都影响不大。如果使用命令模式可以对比一下。我这里代码就贴个图好了(因为是比较早的笔记了,手懒):

   

  简单分析下这个例子:

   一、发送者(setCommond):不关心给哪个button,以及绑定什么事件,只要通过参数传入就好。

  二、命令对象(commondObj):只需要接收到接受者的参数,当发送者发出命令时,执行就好。

  三、接受者(menu):不用关心在哪里被调用被谁调用,只需要按需执行就好了。

  可能从这一个简单的例子没发现命令模式有什么好处,当然了,设计模式的初衷也不是为了解决简单问题的。设想,当有n个button,对应不同的接口时。就能看出来差别了,可能按部就班的绑定n多个事件之后。你会发现多写几个setCommond(btn,obj)更简单。

三、结束语:

  到这里,设计模式就介绍完了。可能大部分时候我们也这么做了,只不过你没有注意到它还有这么个严肃的名称。

  重复而言,使用设计模式的目的是为了提高我们解决问题的效率,不同的设计模式也是针对不同环境的特定方案,不仅仅是单独的某一种设计模式,大多数情况下都是多个模式共存的。切勿为了使用设计模式而强行引入,也切勿不同情况坚持使用某一种设计模式。不要被形式总之快速高效的解决问题才是我们的唯一目的。

相关章节:javascript设计模式详解之命令模式

参考文章:JavaScript设计模式与开发实践

javascript设计模式详解之命令模式的更多相关文章

  1. javascript设计模式详解之策略模式

    接上篇命令模式来继续看下js设计模式中另一种常用的模式,策略模式.策略模式也是js开发中常用的一种实例,不要被这么略显深邃的名字给迷惑了.接下来我们慢慢看一下. 一.基本概念与使用场景: 基本概念:定 ...

  2. Javascript设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  3. javascript设计模式学习之九——命令模式

    一.命令模式使用场景及定义 命令模式常见的使用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的具体操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求的发送者和 ...

  4. Java常用设计模式详解1--单例模式

    单例模式:指一个类有且仅有一个实例 由于单例模式只允许有一个实例,所以单例类就不可通过new来创建,而所有对象都默认有一个无参的构造函数可以创建对象,所以单例类不仅不能提供public的构造方法,还需 ...

  5. Javascript常用的设计模式详解

    Javascript常用的设计模式详解 阅读目录 一:理解工厂模式 二:理解单体模式 三:理解模块模式 四:理解代理模式 五:理解职责链模式 六:命令模式的理解: 七:模板方法模式 八:理解javas ...

  6. 设计模式详解及PHP实现:代理模式

    [目录] 代理模式(Proxy pattern) 代理模式是一种结构型模式,它可以为其他对象提供一种代理以控制对这个对象的访问. 主要角色 抽象主题角色(Subject):它的作用是统一接口.此角色定 ...

  7. [ 转载 ] Java开发中的23种设计模式详解(转)

    Java开发中的23种设计模式详解(转)   设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...

  8. android java 设计模式详解 Demo

    android java 设计模式详解 最近看了一篇设计模式的文章,深得体会,在此基础我将每种设计模式的案例都写成Demo的形式,方便读者研究学习, 首先先将文章分享给大家: 设计模式(Design ...

  9. Java温故而知新(5)设计模式详解(23种)

    一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目 ...

随机推荐

  1. 腾讯云数据库团队:PostgreSQL TOAST技术理解

    作者介绍:胡彬 腾讯云高级工程师 TOAST是"The Oversized-Attribute Storage Technique"的缩写,主要用于存储一个大字段的值.要理解TOA ...

  2. vuejs子组件向父组件传递数据

    子组件通过$emit方法向父组件发送数据,子组件在父组件的模板中,通过自定义事件接收到数据,并通过自定义函数操作数据 <!DOCTYPE html> <html lang=" ...

  3. 取消a标签的页面跳转

    如果代码是:<a href="#" class="juan-btn" onclick="showResult()">提交< ...

  4. js正则表达test、exec和match的区别

    test的用法和exec一致,只不过返回值是 true false. 以前用js很少用到js的正则表达式,即使用到了,也是诸如邮件名称之类的判断,网上代码很多,很少有研究,拿来即用. 最近开发遇到一些 ...

  5. Android 用 camera2 API 自定义相机

    前言 笔者因为项目需要自定义相机,所以了解了一下 Android 关于 camera 这块的 API.Android SDK 21(LOLLIPOP) 开始已经弃用了之前的 Camera 类,提供了 ...

  6. net.sz.framework 框架 轻松搭建数据服务中心----读写分离数据一致性,滑动缓存

    前言 前文讲述了net.sz.framework 框架的基础实现功能,本文主讲 net.sz.framework.db 和 net.sz.framework.szthread; net.sz.fram ...

  7. ajax第三步

    ajaxSend()函数用于设置当AJAX请求即将被发送时执行的回调函数. 这是一个全局AJAX事件函数,用于为任何AJAX请求的ajaxSend事件绑定事件处理函数.当AJAX请求即将被发送时,将触 ...

  8. c#控制台实现post网站登录

    如题,首先我写了一个web页面来实现post登陆,只做演示,代码如下 public void ProcessRequest(HttpContext context) { context.Respons ...

  9. GET 请求复制转发一直等待响应的问题 Transfer-Encoding: chunked

    今天在做Proxy 转发请求的时候发现 GET的请求转发时一直在等待输出. 而Post等其它操作是可以的. 同事告诉我一般一直等待响应可能是输出内容长度和头部ContentLength不一致导致的, ...

  10. node.js系列(实例):原生node.js实现静态资源管理

    /** * node入门之综合案例(一):简易路由 * @Author : by Ghost * @Date : 2016/07/11 * @Description : * 1.引入以下模块 * ht ...