命令模式
为了降低耦合度,将请求的发送者和接收者解耦
发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求
对请求排队
记录请求日志
支持撤销操作
核心在于引入命令类
角色
抽象命令类Command
具体命令类ConcreteCommand
调用者Invoker
接收者Receiver
请求的一方不必知道接收请求的一方,更不必知道请求如何被接收、执行、怎么执行、何时执行

看例子,电视遥控器,电视,人。

1.抽象命令类,或接口

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public interface AbstractCommand {
public void execute();
}

2.命令接收者电视机

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public class Television {
public void open() {
System.out.println("打开电视机");
} public void close() {
System.out.println("关闭电视机");
} public void changeChannel() {
System.out.println("切换电视频道");
}
}

3.具体命令

a.打开命令

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public class TVOpenCommand implements AbstractCommand{
private Television tv;
public TVOpenCommand() {
tv = new Television();
} public void execute() {
tv.open();
}
}

b.关闭命令

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public class TVCloseCommand implements AbstractCommand{
private Television tv;
public TVCloseCommand() {
tv = new Television();
} public void execute() {
tv.close();
}
}

c.更改频道命令

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public class TVChangeCommand implements AbstractCommand{
private Television tv;
public TVChangeCommand() {
tv = new Television();
} public void execute() {
tv.changeChannel();
}
}

4.命令发布者控制者,人

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public class Controller {
private AbstractCommand openCommand,closeCommand,changeCommand;
public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand) {
this.openCommand = openCommand;
this.closeCommand = closeCommand;
this.changeCommand = changeCommand;
} public void open() {
openCommand.execute();
} public void change() {
changeCommand.execute();
} public void close() {
closeCommand.execute();
}
}

5.客户端

package Command;

/**
* Created by Jiqing on 2016/10/26.
*/
public class Client {
public static void main(String a[]) {
AbstractCommand openCommand,closeCommand,changeCommand; openCommand = new TVOpenCommand();
closeCommand = new TVCloseCommand();
changeCommand = new TVChangeCommand(); Controller control = new Controller(openCommand,closeCommand,changeCommand); control.open();
control.close();
control.change();
}
}

执行结果:

打开电视机

关闭电视机

切换电视频道

再看一个撤销案例

package Command.Undo;
abstract class AbstractCommand
{
public abstract int execute(int value);
public abstract int undo();
} class ConcreteCommand extends AbstractCommand
{
private Adder adder = new Adder();
private int value; public int execute(int value)
{
this.value=value;
return adder.add(value);
} public int undo()
{
return adder.add(-value);
}
} class CalculatorForm
{
private AbstractCommand command; public void setCommand(AbstractCommand command)
{
this.command=command;
} public void compute(int value)
{
int i = command.execute(value);
System.out.println("执行运算,运算结果为:" + i);
} public void undo()
{
int i = command.undo();
System.out.println("执行撤销,运算结果为:" + i);
}
} class Adder
{
private int num=0; public int add(int value)
{
num+=value;
return num;
}
} class Client
{
public static void main(String args[])
{
CalculatorForm form = new CalculatorForm();
ConcreteCommand command = new ConcreteCommand();
form.setCommand(command); form.compute(10);
form.compute(5);
form.compute(10);
form.undo();
}
}

执行结果:

执行运算,运算结果为:10

执行运算,运算结果为:15

执行运算,运算结果为:25

执行撤销,运算结果为:15

看类图

JAVA设计模式之【命令模式】的更多相关文章

  1. 折腾Java设计模式之命令模式

    博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...

  2. Java设计模式 之 命令模式

    1      从属模式分类 行为性模式 2      命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ...

  3. JAVA设计模式之 命令模式【Command Pattern】

    一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ...

  4. 14.java设计模式之命令模式

    基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...

  5. java设计模式之命令模式

    学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习 ...

  6. java设计模式之命令模式以及在java中作用

    命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ...

  7. 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式

    目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...

  8. 用Java 8 Lambda表达式实现设计模式:命令模式

    在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...

  9. 折腾Java设计模式之状态模式

    原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...

  10. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

随机推荐

  1. Oracle 单表选择率

    听了猫大师的课,对Oracle CBO又加深了一步理解: 单表选择率: selectivity=1/ndv*a4nulls ocard来自dba_tables.num_rows ndv 来自dba_t ...

  2. TCO 2015 2D

    250分题:给一段仅仅有'0','1'构成的字符串,然后给出串上平衡点的定义:在串上找到某个点(位置是p),这个点将串分成左右两部分(能够为空),左右分别计算字符的值的和,假设左边有字符是'1',那么 ...

  3. SAM学习笔记

    SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次 ...

  4. python绘制caffe中网络模型

    caffe-master/python/draw_net.py 实现绘制caffe中定义的网络模型功能,将.prototxt文件可视化. 需要先安装pydot和protobuf工具 通过Anacond ...

  5. oracle 11gR2 如何修改vip

    因为业务需要,需要将p570a主机和p570b主机上的vip做修改 修改前ip 192.168.128.12   p570a-vip 192.168.128.13   p570b-vip 修改后ip ...

  6. 光标属性CSS cursor 属性

    CSS cursor 属性 CSS cursor属性,以前不知道,如果以后用到自己看的 <html> <body> <p>请把鼠标移动到单词上,可以看到鼠标指针发生 ...

  7. [Javascript] 层控制(隐藏、显示、卷起、展开)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 33.Qt模型与视图

    #include "mainwindow.h" #include <QApplication> #include <QAbstractItemModel> ...

  9. mysql授予IP远程访问访问语句

    mysql -u root -p; GRANT ALL PRIVILEGES ON *.* TO '用户名'@'你的IP地址' IDENTIFIED BY '密码' WITH GRANT OPTION ...

  10. PHP的错误处理和异常处理

    由于教程是围绕着文件打开做的错误处理,所以先记录几个用于文件处理的一些函数,fopen 用于打开一个文件:file_exists 用于检查目录是否存在:fclose( $变量 )用于指定关闭打开的文件 ...