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实体类,某个 ...
随机推荐
- JS基本数据类型
基本数据类型: Undefined,null,boolean,number,string symbol(ES6) 复杂数据类型: object undefined: 变量声明未初始化,自动为undef ...
- Flask jinja2
{{ }} #引用 执行 非逻辑代码 {% %} #逻辑代码 引用变量 @app.template_global() # 全局函数 Markup # 安全标签字符串儿 {% macro func() ...
- EasyAR 开发实例---AR礼物(简单demo)
一个节日礼物效果 --显示模型 在本次的案例中,我使用的是unity5.6.3版本,EasyAR 为2.0.(用1.0的版本,在渲染那块有问题) [导入SDK]到EasyAR官网(http://www ...
- css-方形边框四角
项目中遇到下图这种样式,刚开始想切图解决 后来想到更好的解决办法,代码如下: HTML: <div class="BoxWrap"> <div class=&qu ...
- 在C#中,Json的序列化和反序列化的几种方式总结 转载
转载自 https://www.cnblogs.com/caofangsheng/p/5687994.html 谢谢 在这篇文章中,我们将会学到如何使用C#,来序列化对象成为Json格式的数据 ...
- C盘清理(安装Visual Studio 或者Office后)
安装过Office,可能会存在一个C:\\MSOCache的隐藏目录,如果在D盘安装,这个文件夹可能会在D盘根目录下.该目录为Offices安装组件的目录,理解为安装包即可,如果日后不再修改OFFIC ...
- linux 时间同步的2种方法(转)
linux 时间同步的2种方法 张映 发表于 2012-10-23 分类目录: 服务器相关 标签:linux, ntp, 同步, 时间服务器 由于硬件的原因,机器或多或少的根标准时间对不上,一个月的误 ...
- C#_02.14_基础五_.NET类
C#_02.14_基础五_.NET类 一.类实例: 我们前面说过类是一个模板,我们通过类创建一个又一个的实例,通常情况下类当中的变量是每一个实例都各有一份的,互相不影响,而静态字段是除外的,静态字段是 ...
- MUI学习02-顶部导航栏
建议:先看一下MUI注意事项 连接:http://ask.dcloud.net.cn/article/122 固定栏靠前 所谓的固定栏,也就是带有.mui-bar属性的节点,都是基于fixed定位的元 ...
- 超过 130 个你需要了解的 vim 命令
从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编辑器之一.5年前,我写了一个问自己名为 “每个程序员都应该知道的 100 个 vim 命令” 这次算是之前那篇文章的改进版,希望你会 ...