模式定义:

[定义]: 将一个请求封装成一个对象,使得你用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

  组成: 调用者(Invoker),命令请求(Command,包括接口或抽象,以及实现,待对象化),接收者(实现者 Receiver,包括抽象接口,及实现),三个角色;

  过程: 命令通过请求者发送给接收者来实现; 命令委托间接通知,再执行实现;

  理解: 请求可能会有多个,接收者可能也有多个,可能一个请求一个执行者,也可能多个请求一个执行者; 请求以及执行者是耦合的,客户端可以调用时,可以给请求指定个执行者,以及执行方法; 这个就可以达到请求参数化的效果,并可以对请求进行排队列等等操作;

 因此它可以通过以下方式来表达 请求者与接收者 的耦合,以及请求者通过发送命令,不必具体知识执行了什么的效果;

var invoker = new Invoker(concreteCommand1);
invoker.execute();
invoker = new Invoker(concreteCommand2);
invoker.execute();

 或者:

var invoker = new Invoker();
invoker.setCommand(concreteCommand1);
invoker.execute();
var invoker2 = ....

以上的语句特点:

  1. 一个请求只执行一个操作,每个操作都伴随一个具体的命令实现类;
  2. 因为具体的执行操作是在具体的接收着进行的,请求通过执行命令类才能执行到,因此它又具有委托(callback)的特点;

这样设计的优缺点:

这里要说到两个设计原则:开闭原则,以及依赖倒置原则;

 开闭原则:就是对扩展是开放的,对于修改是关闭的;它是面向对象里最重新的原则之一,是提高代码可复用的原则;

      现实世界中,存在在众多行为操作类似的事物,比如不一样的人,都拥有吃饭,看书,运动的能力;

      但每个人表现出来的行为动作可能,喜好可能是是不一样;但我们将每个人各种动作(方法)整合在一个大类里实现时,

      第一会出现很多类似重复的方法,第二整个类会很大,很杂,不好维护;当仅是其中一个的喜好出现不一样时,修改可能还会影响到其他人的操作;

      因此在面向对象的思想里,推荐对每个类基于抽象进行编程,不管是继承抽象,或是实现接口;这样出现需对新的类似事物进行扩展时,只需基于抽象进行扩展;

 依赖倒置原则:

1. 抽象不能依束于具体实现,具体实现要依赖于抽象; 简单就是编程要针对抽象或接口编程,不要针对具体实现编辑;

      2. 开闭原则是整个面向对象编辑的基础,也是终级目标;依赖倒置原则是实现开闭原则的一个基础;

      3. 想对于具体实现,抽象或接口会比较稳定,针对接口或抽象进行编辑,提高开发的稳定性,不会由具体实现因为具体情况的多变不稳定性,而可能需要经常修改;

          针对稳定的抽象进行编辑,多变的具体实现针对抽象实现,提高内聚低耦合的效果,具体独立,才可以更好的针对变化进行扩展,而不是修改;

应用场景:

a. 比如老板让员工执行某项任务; (老板: Invoker,员工: Receiver,请求命令:command)

  老板可以随便指定一个员工(员工多个),员工实现手段不一样,老板不必知道;

  请求命令,工作任务也有很多种...  (每个任务,也都各自的实现手段跟组成,多个方法)

b. 比如 通过摇控机控制多种设备的开机关机等; (手是Invoker,按钮是Receiver, 命令是设备的开关机)

  摇控机上多组按钮组合(电灯的开跟关,电视机,以及电风扇的)

  手可以点击任意一个按钮;

  命令这里就是开或关;

源码实现:

//接收者
function Worker() {
}
Worker.prototype.doMethod = function() {
//do somethong;
} //命令
functiom Command(worker) {
this.worker = worker;
} Command.prototype.doCommand = function() {
// do command
this.worker.doMethod();
} //调用者
function Invoker(command) {
this.doWork = function() {
command.doCommand
}
} ///////////////////////////////////////////////////////// //客户端调用(工作具体工作实现)
var workerA = new Worker(); var commandA = new Command(workerA); var invoker = new Invoker(commandA);
invoker.doWork();

换成JAVA的写法,即Worker一个接口或抽象类,两个具体的工人类(Worker实现),Command为接口或抽象,一两个具体的实现;

调用处,针对接口或抽象进行调用具体的请求以及接收者,调用者Invoker再执行相应的方法;

[设计模式] javascript 之 命令模式的更多相关文章

  1. 设计模式学习之命令模式(Command,行为型模式)(12)

    一.命令模式的定义 命令模式属于对象的行为型模式.命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开.命令模式的实现可以提供命令的撤销和恢复功能 ...

  2. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  3. java设计模式-----23、命令模式

    概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 命令模式(Command Pattern)是一种 ...

  4. c#设计模式系列:命令模式(Command Pattern)

    引言 命令模式,我感觉"命令"就是任务,执行了命令就完成了一个任务.或者说,命令是任务,我们再从这个名字上并不知道命令的发出者和接受者分别是谁,为什么呢?因为我们并不关心他们是谁, ...

  5. 大话设计模式Python实现-命令模式

    命令模式(Command Pattern):将请求封装成对象,从而使可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. 下面是一个命令模式的demo: #!/usr/bi ...

  6. 《Head first设计模式》之命令模式

    命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 一个家电公司想邀请你设计一个家电自动化遥控器的API.这个遥控器有7个 ...

  7. 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...

  8. C#设计模式系列:命令模式(Command)

    1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...

  9. Java-马士兵设计模式学习笔记-命令模式

    一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...

随机推荐

  1. bzoj2555(后缀自动机+LCT)

    题目描述 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支持这些操作. 题解 做法很自然,建出后缀自动机,维护每个节点的right ...

  2. [WC2010]重建计划(分数规划+点分治+单调队列)

    题目大意:给定一棵树,求一条长度在L到R的一条路径,使得边权的平均值最大. 题解 树上路径最优化问题,不难想到点分治. 如果没有长度限制,我们可以套上01分数规划的模型,让所有边权减去mid,求一条路 ...

  3. centos7下zookeeper集群安装部署

    应用场景:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件. 它是一个为分布式应用提供一致性服务的软 ...

  4. luoguP4707 重返现世

    收集邮票加强版,每个邮票不是等概率获得的了. 而且是获得K个,如果把一个全集S集合找出其获得时间集合(显然获得时间两两不同)的话,那么就是第n-k+1大的期望! %%%Sooke min-max容斥扩 ...

  5. 软件在 win7 上运行时显示乱码

    一个用户反应后,我当时就蒙圈了,因为之前从未遇到过: 百度一下后,发现用户的这种情况比较特殊,从表面上看,[控制面板]和[注册表]相关项设置都正常,为什么还显示乱码呢? 到最后一步如果已经是(简体,中 ...

  6. isinstance,issubclass,内置函数__str__和__repr__,__format__,dir()函数

    isinstance(obj,cls) 检查是否obj是否是类 cls 的对象 #对象与类之间的关系 判断第一个参数是否是第二个参数的实例 # 身份运算 # 2 == 3 # 值是否相等# 2 is ...

  7. M1-day08-数据库加锁

    一.关于数据库加锁主要分为几类 1.原生sql 1.开启事物 begin; select * from host for update; commit; 注意:INNODB支持表锁和行锁,MyISAM ...

  8. python对象继承

    继承允许我们在两个或者更多的类之间创建一种“是一个”的关系,这种关系把共同的细节抽象到一个超类里. 从技术上讲,每一个我们创建的类都使用了继承,所有的python类都是一个叫做object的特殊类的子 ...

  9. mybatis多数据源报错

    2018-12-06 16:58:35,709 [ main ] - [ INFO ] [ org.springframework.core.KotlinDetector : 57 ] - Kotli ...

  10. bank_card.js

    function init() { undefined = "undefined"; mkCClist(); } function ccchk(cdi) { output1 = & ...