【设计模式】—— 命令模式Commond
前言:【模式总览】——————————by xingoo
模式意图
将一个请求封装成一个对象,从而对这个命令执行撤销、重做等操作。
典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo、Redo等等。
另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作。这个机制也是java事件的处理方式。
应用场景
1 命令抽象成对象
2 在不同的时刻,指定或者排队命令
3 支持 Undo或者Redo等操作
4 修改日志,当系统崩溃时,利用修改日志执行撤销
5 原语操作上构造一个高层系统(不理解)
模式结构

Invoker 命令的触发者,触发一个命令的执行。
/**
* 命令的触发者,发送命令
* @author xingoo
*
*/
class Invoker{
private Commond commond; public Invoker(Commond commond) {
this.commond = commond;
} public void action(){
commond.excute();
}
}
Receiver 命令的接受者,针对命令,执行一定的操作。
/**
* 命令的接受者,负责接收命令,进行处理
* @author xingoo
*
*/
class Receiver{ public Receiver() { } public void action(){
System.out.println("Action of receiver!");
}
}
Commond 命令的抽象接口
/**
* 命令接口,定义命令的统一接口
* @author xingoo
*
*/
interface Commond{
public void excute();
}
ConcreteCommond 具体的命令,关联一个接收者对象,当命令执行时,执行这个接收者对应的操作。
/**
* 具体的命令
* @author xingoo
*
*/
class ConcreteCommond implements Commond{ private Receiver receiver; public ConcreteCommond(Receiver receiver) {
this.receiver = receiver;
} public void excute() {
receiver.action();
} }
全部代码
package com.xingoo.Commond;
/**
* 命令的触发者,发送命令
* @author xingoo
*
*/
class Invoker{
private Commond commond; public Invoker(Commond commond) {
this.commond = commond;
} public void action(){
commond.excute();
}
}
/**
* 命令的接受者,负责接收命令,进行处理
* @author xingoo
*
*/
class Receiver{ public Receiver() { } public void action(){
System.out.println("Action of receiver!");
}
}
/**
* 命令接口,定义命令的统一接口
* @author xingoo
*
*/
interface Commond{
public void excute();
}
/**
* 具体的命令
* @author xingoo
*
*/
class ConcreteCommond implements Commond{ private Receiver receiver; public ConcreteCommond(Receiver receiver) {
this.receiver = receiver;
} public void excute() {
receiver.action();
} }
/**
* 客户端调用者
* @author xingoo
*
*/
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Commond commond = new ConcreteCommond(receiver);
System.out.println("Commond register in here!"); try {
Thread.sleep();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("Commond excute in here!");
Invoker invoker = new Invoker(commond);
invoker.action();
}
}
运行结果
Commond register in here!
Commond excute in here!
Action of receiver!
【设计模式】—— 命令模式Commond的更多相关文章
- linkin大话设计模式--命令模式
linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...
- 【设计模式】Java设计模式 - 命令模式
Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...
- [Head First设计模式]餐馆中的设计模式——命令模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 命令模式
用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构
- 深入浅出设计模式——命令模式(Command Pattern)
模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请 ...
- Java设计模式-命令模式(Command)
命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...
- 设计模式--命令模式(Command)
基本概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了. 命令模式的 ...
- javascript设计模式——命令模式
前面的话 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.餐厅还可 ...
- C++设计模式——命令模式
什么是命令模式? 在GOF的<设计模式:可复用面向对象软件的基础>一书中对命令模式是这样说的:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以 ...
- 浅谈js设计模式 — 命令模式
命令模式最常见的应用场景是:有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么.此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦 ...
随机推荐
- Underscore.js 入门-常用方法介绍
Underscore.js是一个很精干的库,压缩后只有4KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程.MVC框架Backbone.js就将这个库作为自 ...
- Ubuntu 重新安装声卡驱动
有的时候ubuntu 的声卡不能用,没有声音也不能使用麦克风,所有很困惑,查看声卡驱动的时候不显示声卡的驱动,所有我们要自己安装声卡驱动, 1.下载驱动包这是比较新的声卡驱动,1.0.20 $ wge ...
- 通过HttpWebRequest调用webService
调用远端接口,向远端接口写入一个xml文件(loginLog为xml的字符串).关键方法如下: public object InsertAuditLog(string loginLog) { //Ws ...
- 2017-2018-2 20155234『网络对抗技术』Exp6:信息收集与漏洞扫描
whois查询 whois用来进行域名注册信息查询.以常用的百度为例,输入whois baidu.com可查询到3R注册信息,包括注册人的姓名.组织和城市等信息. 我们可以很清楚地看到baidu的3R ...
- # 20155319 Exp3 免杀原理与实践
20155319 Exp3 免杀原理与实践 基础问题 (1)杀软是如何检测出恶意代码的? 基于特征码的检测 启发式的恶意软件检测 基于行为的恶意软件检测 (2)免杀是做什么? 免杀,从字面进行理解,避 ...
- 20155330 《网络对抗》 Exp5 MSF基础应用
20155330 <网络对抗> Exp5 MSF基础应用 实践过程记录 主动攻击实践:MS08_067漏洞攻击 攻击机:kali IP地址:192.168.124.132 靶机:windo ...
- vue-cli 动态绑定图片失败
1.template 中引用图片,第一个为固定路径,第二个为动态绑定路径 eg: <img src="XXXXXX.png" alt=""> < ...
- Android开发——进程间通信之Messenger
0. 前言 不论是Android还是其他操作系统,都会有自己的IPC机制,所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是很不同的概念,线程是CPU ...
- Merge:解析on子句和when not match子句的陷阱
在细节上,体现编程的修养.每一位大师,master,其基础必定夯实.废话不多说,直接上干货,Merge子句用于对两个数据表执行数据同步,On子句指定匹配(when matched)条件,When子句指 ...
- 验证Xpath和CSS 路径是否有效
XPath定位和CSS定位在Selenium中是经常使用的. 在FireFox浏览器和Chrome浏览器,可以使用这样的方法来验证定位是否准确. 以Chrome浏览器做范例 按键盘的F12 进入开发者 ...