23命令模式Command
一、什么是命令模式
Command模式也叫命令模式 ,是行为设计模 式的一种。Command模式通过被称为 Command的类封装了对目标对象的调用行为以及调用参数。
二、命令模式的应用场景
在面向对象的程序设计中,一个对象调用另一个对象, 一般情况下的调用过程是:创建目标对象实例;设置调 用参数;调用目标对象的方法。
但在有些情况下有必要使用一个专门的类对这种调用 过程加以封装,我们把这种专门的类称作command类。
- 整个调用过程比较繁杂,或者存在多处这种调用。 这时,使用Command类对该调用加以封装,便于功能的 再利用。
- 调用前后需要对调用参数进行某些处理。
- 调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。
三、命令模式的结构

四、命令模式的角色和职责
Command Command抽象类。
ConcreteCommand Command的具体实现类。
Receiver 需要被调用的目标对象。
Invorker 通过Invorker执行Command对象。
ex1:
小商贩
/*
* 小商贩
*/
public class Peddler { //卖苹果
public void sailApple() {
System.out.println("卖苹果");
} //卖香蕉
public void sailBanana() {
System.out.println("卖香蕉");
}
}
测试
public class MainClass {
public static void main(String[] args) {
Peddler peddler = new Peddler();
peddler.sailApple();
peddler.sailBanana();
}
}
================================================================================
ex2:
小商贩
/*
* 小商贩
*/
public class Peddler { //卖苹果
public void sailApple() {
System.out.println("卖苹果");
} //卖香蕉
public void sailBanana() {
System.out.println("卖香蕉");
}
}
命令
//命令
public abstract class Command {
private Peddler peddler; public Command(Peddler peddler) {
this.peddler = peddler;
} public Peddler getPeddler() {
return peddler;
} public void setPeddler(Peddler peddler) {
this.peddler = peddler;
} public abstract void sail();
}
苹果命令
//苹果命令
public class AppleCommand extends Command { public AppleCommand(Peddler peddler) {
super(peddler);
} public void sail() {
this.getPeddler().sailApple();
}
}
香蕉命令
//香蕉命令
public class BananaCommand extends Command{ public BananaCommand(Peddler peddler) {
super(peddler);
} public void sail() {
this.getPeddler().sailBanana();
}
}
测试
public class MainClass {
public static void main(String[] args) {
Peddler peddler = new Peddler();
// peddler.sailApple();
// peddler.sailBanana();
Command appleCommand = new AppleCommand(peddler);
Command bananaCommand = new BananaCommand(peddler);
appleCommand.sail();
bananaCommand.sail();
}
}
=====================================================
ex3:
小商贩
/*
* 小商贩
*/
public class Peddler { //卖苹果
public void sailApple() {
System.out.println("卖苹果");
} //卖香蕉
public void sailBanana() {
System.out.println("卖香蕉");
}
}
命令 抽象
//命令
public abstract class Command {
private Peddler peddler; public Command(Peddler peddler) {
this.peddler = peddler;
} public Peddler getPeddler() {
return peddler;
} public void setPeddler(Peddler peddler) {
this.peddler = peddler;
} public abstract void sail();
}
苹果命令
//苹果命令
public class AppleCommand extends Command { public AppleCommand(Peddler peddler) {
super(peddler);
} public void sail() {
this.getPeddler().sailApple();
}
}
香蕉命令
package com.ibeifemg.ex3;
//香蕉命令
public class AppleCommand extends Command { public AppleCommand(Peddler peddler) {
super(peddler);
} public void sail() {
this.getPeddler().sailApple();
}
}
服务
//服务
public class Waiter {
private Command command; public Command getCommand() {
return command;
} public void setCommand(Command command) {
this.command = command;
} public void sail() {
command.sail();
}
}
测试
public class MainClass {
public static void main(String[] args) {
Peddler peddler = new Peddler();
// peddler.sailApple();
// peddler.sailBanana();
Command appleCommand = new AppleCommand(peddler);
Command bananaCommand = new BananaCommand(peddler);
// appleCommand.sail();
// bananaCommand.sail();
Waiter waiter = new Waiter();
waiter.setCommand(appleCommand);
waiter.sail();
waiter.setCommand(bananaCommand);
waiter.sail();
}
}
========================================================================
ex4:
小商贩
/*
* 小商贩
*/
public class Peddler { //卖苹果
public void sailApple() {
System.out.println("卖苹果");
} //卖香蕉
public void sailBanana() {
System.out.println("卖香蕉");
}
}
命令
//命令
public abstract class Command {
private Peddler peddler; public Command(Peddler peddler) {
this.peddler = peddler;
} public Peddler getPeddler() {
return peddler;
} public void setPeddler(Peddler peddler) {
this.peddler = peddler;
} public abstract void sail();
}
苹果命令
//苹果命令
public class AppleCommand extends Command { public AppleCommand(Peddler peddler) {
super(peddler);
} public void sail() {
this.getPeddler().sailApple();
}
}
香蕉命令
//香蕉命令
public class BananaCommand extends Command{ public BananaCommand(Peddler peddler) {
super(peddler);
} public void sail() {
this.getPeddler().sailBanana();
}
}
服务
//服务
public class Waiter {
private List<Command> commands = new ArrayList<Command>(); public void setOrder(Command command) {
commands.add(command);
} public void removeOrder(Command command) {
commands.remove(command);
} public void sail() {
for(Command command : commands) {
command.sail();
}
}
}
测试
public class MainClass {
public static void main(String[] args) {
Peddler peddler = new Peddler();
// peddler.sailApple();
// peddler.sailBanana();
Command appleCommand = new AppleCommand(peddler);
Command bananaCommand = new BananaCommand(peddler);
// appleCommand.sail();
// bananaCommand.sail();
Waiter waiter = new Waiter();
//下订单
waiter.setOrder(appleCommand);
waiter.setOrder(bananaCommand);
//移除订单某项
waiter.removeOrder(appleCommand);
waiter.sail();
}
}
23命令模式Command的更多相关文章
- 设计模式 - 命令模式(command pattern) 多命令 具体解释
命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...
- 设计模式 - 命令模式(command pattern) 具体解释
命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...
- 设计模式 ( 十三 ) 命令模式Command(对象行为型)
设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...
- 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释
命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...
- 乐在其中设计模式(C#) - 命令模式(Command Pattern)
原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...
- 命令模式 Command 行为型 设计模式(十八)
命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...
- Java 设计模式系列(十四)命令模式(Command)
Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...
- 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释
命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...
- 二十四种设计模式:命令模式(Command Pattern)
命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...
随机推荐
- PAT基础6-1
6-1 简单输出整数 (10 分) 本题要求实现一个函数,对给定的正整数N,打印从1到N的全部正整数. 函数接口定义: void PrintN ( int N ); 其中N是用户传入的参数.该函数必须 ...
- 微信小程序-转发
仅供参考 1,js: onShareAppMessage(res) { return { title: '我在使用俺搜·找客户,10万+材料人都在用,就差你了', path: '/pages/inde ...
- vue路由打开新窗口
一. <router-link>标签实现新窗口打开: 官方文档中说 v-link 指令被 <router-link> 组件指令替代,且 <router-link> ...
- 让你提升命令行效率的 Bash 快捷键
生活在 Bash shell 中,熟记以下快捷键,将极大的提高你的命令行操作效率. 编辑命令 Ctrl + a :移到命令行首 Ctrl + e :移到命令行尾 Ctrl + f :按字符前移(右向) ...
- Spark2.3(四十):如何使用java通过yarn api调度spark app,并根据appId监控任务,关闭任务,获取任务日志
背景: 调研过OOZIE和AZKABA,这种都是只是使用spark-submit.sh来提交任务,任务提交上去之后获取不到ApplicationId,更无法跟踪spark application的任务 ...
- WPF 实现窗体拖动
C# 实现代码 this.Loaded += (r, s) => { this.MouseDown += (x, y) => { if (y.LeftButton == MouseButt ...
- linux下安装EJBCA 搭建私有CA服务器
linux下安装EJBCA 搭建私有CA服务器 EJBCA是一个全功能的JAVA的CA系统软件,我们可以用此搭建私有CA服务器: 一:首先我的测试环境: 1. linux mint18.3 62位: ...
- Java 基础【19】代理
Java 代理(Proxy)模式与现实中的代理含义一致,如旅游代理.明星的经纪人. 在目标对象实现基础上,增加额外的功能操作,由此来扩展目标对象的功能. JavaWeb 中最常见的过滤器.Struts ...
- linux 安装nvm,通过nvm安装node
1,nvm git地址点击打开链接,安装命令 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh ...
- Native App开发 与Web App开发(原生与web开发优缺点)
Native App开发 Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是 ...