Head First 设计模式 第6章 命令模式
第6章 命令模式
在本章,我们将把封装带到一个全新的境界,把方法调用封装起来。没错,通过方法调用,我们可以把运算块包装成型。所以,调用此运算的对象不需要关心运算是如何进行的,只要知道如何使用包装成型的方法来完成它就可以。通过封装方法调用,我们还可役做一些其他很重要的事情,例如记录日志,或者重复使用封装来实现撤销操作。
首先,让我们来看下命令模式吧。
1丶定义:将“请求”封装成对象,以便使用不同的请求,日志或者队列来参数化其他对象,由其他对象来完成“请求”的实际调用,以达到请求的发起者和执行者之间的解偶。
说一个命令模式的经典介绍场景吧,那就是遥控器控制电器(此处以风扇来介绍)。我们的遥控器可以打开(on)关闭(off)风扇,或者为风扇换档(1 2 3)。那么,在命令模式中是怎么实现的呢?
首先,看一下在这个打开风扇这个过程中,都经过了哪些动作。
1)小明拿起遥控器按下“on”按钮;
2)遥控器接收到“on”按钮按下操作,然后将这个信号发送给风扇;
3)风扇接受到遥控器发送的信号后,打开风扇。
我们来分解下在这些动作中都有那些角色,进行了那些操作。
Client-小明:发起请求(按下“on”按钮)
Command-信号:信号会被角色传递
Invoker-遥控器:接收信号,并把信号(Command)发送给风扇
Receiver-风扇:按照请求,打开风扇。
解释下命令模式的流程,就是,Client发起请求,然后把请求封装成命令对象(Command),Invoker会接收命令对象,然后执行命令,Invoker执行命令会调用Receiver的方法来完成Client的请求。对应的类图如下:
通过这种方式,我们就实现了请求的发起者(CLient)和执行者(Receiver)的解偶了。我请求发起之后,由调用者Invoker接收之后,即便请求发起者消亡,也不会影响该请求的执行。
本章涉及到的新设计原则
依赖倒置原则:尽量依赖于抽象编程,而不是具体实现
命令模式在日志,队列的应用,后续追加......
如有错误,请指出,大家共同学习
如转载,请说明出处
Head First 设计模式 第6章 命令模式的更多相关文章
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- 第14章 命令模式(Command Pattern)
原文 第14章 命令模式(Command Pattern) 命令模式(Command Pattern) 概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如 ...
- javascript设计模式详解之命令模式
每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...
- Java设计模式(22)命令模式(Command模式)
Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...
- C#设计模式之11:命令模式
C#设计模式之11:命令模式 命令模式 命令模式用来解决一些复杂业务逻辑的时候会很有用,比如,你的一个方法中到处充斥着if else 这种结构的时候,用命令模式来解决这种问题就会让事情变得简单很多. ...
- 第 12 章 命令模式【Command Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思,但是更深化了,用模式来描 ...
- Head First 设计模式 第4章工厂模式
第4章 工厂模式 在介绍工厂模式之前,先让我们来看一个例子. 这里有一个Pizza类,用来生产pizza,并返回对象,具体代码如下: package com.ek.factory.simple; im ...
- C#设计模式之十五命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲"行为型"设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command P ...
- C#设计模式之十四命令模式(Command Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第二个模式,该模式是[命令模式],又称为行动(Action)模式或交易(Transaction)模式,英文名称是:Command Pattern.还是老套路 ...
随机推荐
- MySQL加密和解密案例
define("ENCRYPT",'2998a15c0cd853edad7');//密钥key 被存储的数据库的字段设置成blob格式(二进制) //AES_ENCRYPT 加密 ...
- mac如何进入应用程序的内部文件夹?
在程序点击右键,选择显示包内容,就可以看到了
- 【Android Developers Training】 16. 暂停和恢复一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 自己编写的 C++ 超轻量级日志类
[自己编写的 C++ 超轻量级日志类(兼容vc++6.0.vs2010.vs2015)] 先来看效果: [测试文件:test.cpp] /* 作者:闫文山 时间:2017/07/02 介绍: 本日志类 ...
- Java基础(1) - 语法 & 概念
Java基础语法 基础 1. Java对大小写敏感 2. Java注释 //单行注释 这是一行注释 /* 这里是多行 注释 */ /** 这里是文档注释 @author 0o晓月メ */ 3. 访问修 ...
- java-bootstrap
先来看一段每一个项目都要写的BASH脚本. #!/usr/bin/env bash in start ) ;; stop ) ;; restart ) shift "$0" sto ...
- Flask+uwsgi+Nginx+Ubuntu部署
学了一段时间flask,可是一直没有做过部署, 于是想着怎么部署呢, 想想,先吧服务给搞通吧,于是呢 就先想着去吧服务给搞起来,这里选择的是Flask+uwsgi+Nginx+Ubuntu, Pyth ...
- Java的数据类型和参数传递
Java提供的数据类型主要分为两大类:基本数据类型和引用数据类型. Java中的基本数据类型 名称 大小 取值范围 byte型 (字节) 8bit -128-127 (-2^7到2^7-1) sho ...
- hdu2410(水)
题意 如果两个数字除了带问号的位以外都相同,我们称这两个数可以相互匹配 给你两个数,其中第一个数字里有一些问号,问有多少个大于第二个数的数字可以和第一个数字匹配 一开始懒得读题,到网上搜题意,结果居然 ...
- 我的学习之路_第三十章_servlet
servlet:小服务程序 servlet是JavaWeb体系中的三大核心(servlet/Filter/Listener)之一,而且是最主要的那个. 作用:接受请求,处理请求,做出响应 继承体系:s ...