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实体类,某个 ...
随机推荐
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数 (转)
http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORAC ...
- win10电脑录教学视频的时候有回声或者通话的时候有回声,严重干扰录制效果,解决方式。
1.右键点击屏幕右下脚的小喇叭图标. 2.选择声音. 3.选择“录制”,出现如下 4.选择侦听 5.把侦听此设备 的打勾去掉.然后点击应用,点击确定,即可. 再也没有回声的烦恼了.
- CSS单位和颜色表
- Docker 常用命令(二)
4. 查看Docker镜像创建历史: docker history flaskhello 3. Docker提交镜像 docker build -t flaskhello . docker run - ...
- JS膏集03
JS膏集03 1.复习 原型: * 在构造函数中有一个属性:prototype,是原型,也是一个对象,程序员使用的 * 在实例对象中有一个属性:__proto__,是原型,也是一个对象,浏览器使用的, ...
- 虚拟串口VSPD破解版 亲测win10 64可用
虚拟串口VSPD破解版 亲测win10 64可用 点击下载
- Visual Studio 2015编译Lua 5.3.4遇到的坑
被坑的不浅,遇到错误:" LNK1561:必须定义入口点",解决方案删除再建,步骤一遍一遍操作,还是报错.如下图所示: 首先,它必须要改成DLL或者LIB(动态/静态库),如果是应 ...
- [CSS] Useful CSS tool for Web designer and developer
1. Color Picker (Chrome) You might know how to use color picker in Chrome, recently there is a featu ...
- 找回Android studio的帮助文档
对于业余写点小程序,自娱自乐的我来说,写程序过程的帮助文档非常重要,毕竟不是专业人士.用Visual Studio时,习惯于光标一移到一个类或对象上面,马上出现相应的帮助文档(如图) studio的帮 ...
- c# System.Threading.Thread
using System; using System.Threading; // Simple threading scenario: Start a static method running // ...