JAVA设计模式之【命令模式】
命令模式
为了降低耦合度,将请求的发送者和接收者解耦
发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求
对请求排队
记录请求日志
支持撤销操作
核心在于引入命令类
角色
抽象命令类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设计模式之【命令模式】的更多相关文章
- 折腾Java设计模式之命令模式
博客原文地址 折腾Java设计模式之命令模式 命令模式 wiki上的描述 Encapsulate a request as an object, thereby allowing for the pa ...
- Java设计模式 之 命令模式
1 从属模式分类 行为性模式 2 命令模式意图 命令模式可将动作的请求者和动作的执行者对象中解耦. 该模式将一个行为操作发起者的请求封装到对象中,该请求由另外一个对象执行. 将动作 ...
- JAVA设计模式之 命令模式【Command Pattern】
一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ...
- 14.java设计模式之命令模式
基本需求: 一套智能家电,有照明灯.风扇.冰箱.洗衣机,我们只要在手机上安装app就可以控制对这些家电工作 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App分别控制,我们希望只要一个 ...
- java设计模式之命令模式
学校中.生活中.社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在.命令这一词也就在阶层中诞生.家长命令孩子,老师命令学生,领导命令小娄娄.这些都在我们的生活存在的东西,相信这一个模式学习 ...
- java设计模式之命令模式以及在java中作用
命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请 ...
- 玉帝传美猴王上天,大闹天宫之Java设计模式:命令模式
目录 示例 改进代码 命令模式 定义 意图 主要解决问题 何时使用 优缺点 玉帝传美猴王上天 命令模式和策略模式的区别 示例 系统需要设计一个命令行界面,用户可输入命令来执行某项功能,系统的功能会不断 ...
- 用Java 8 Lambda表达式实现设计模式:命令模式
在这篇博客里,我将说明如何在使用 Java 8 Lambda表达式 的函数式编程方式 时实现 命令 设计模式 .命令模式的目标是将请求封装成一个对象,从对客户端的不同类型请求,例如队列或日志请求参数化 ...
- 折腾Java设计模式之状态模式
原文地址 折腾Java设计模式之状态模式 状态模式 在状态模式(State Pattern)中,类的行为是基于它的状态改变的.这种类型的设计模式属于行为型模式.在状态模式中,我们创建表示各种状态的对象 ...
- Java设计模式——装饰者模式
JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...
随机推荐
- MyEclipse改动内存大小
方式一网上说的(没有測试过): 找到MyEclipse的安装文件夹,一般假设不改动的话默觉得C:\MyEclipse10.1\Genuitec\MyEclipse 10.1有一个myeclipse.i ...
- Word技巧杂记(一)——去掉页眉上方的黑线
今天在调整文章的格式时,突然发现在页眉的上方有一条巨粗无比的黑线,不知从何处冒出来的(如下图) 经过长时间的研究,终于发现原来这是页面的边框.解决办法也很简单: 格式->边框与底纹->页面 ...
- angularjs1-2,作用域、代码压缩
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- CALayer初认识
CALayer :CA就是coreAnimation 核心动画 它是同时支持 Mac OS 和 iOS系统的 所有的核心动画都是通过CALayer来实现的 UIView本身是不具备显示功能的 是它内部 ...
- vue入门--初始化
VUE初始化时,可以用vue init webpack-simple或者vue init webpack.前者是简易版的工程,后者是标准的初始化.工程创建成功后,打开发现两个的目录结构有很大不同.si ...
- Java NIO(一)概述
说明 java NIO是从java1.4开始引入的一个新的IO API,它支持面向缓冲区,基于通道的IO操作,它的核心是通道(channel),缓冲区(buffer),选择器(selector) NI ...
- AlertDialog的使用
1.Alertdialog的几种形式: 2.第一种:简单对话框 AlertDialog.Builder localBuilder = new AlertDialog.Builder(this); lo ...
- ZBrush中Tool工具的保存
ZBrush软件的界面及操作方法与其他的三维软件完全不同,很多初学者常常会觉得有些困难,接下来我们就讲解一下ZBrush®最为基础的操作-Tool工具的保存. 首先要明白什么是Tool工具?我们创建的 ...
- 关于背景颜色、TEXT、<b>、<i>、<u>、<br>、< >、<br>、<br>、h1-h6、<span>、<div>、<ol>、<ul>、<a>标签的用法(下载、跳转、锚点)、Img插入的用法
<html> <head> <meta charset="UTF-8"> <title></ ...
- AIM Tech Round 5 1028cf(A-E)
AIM Tech Round 5 (codeforces上题目编号是1028)(A-E) ---完全被这次比赛打击,自己真的很渣--- 战况 依旧3题选手 被构造题坑得好惨 稍稍涨了rating,希望 ...