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实体类,某个 ...
随机推荐
- Django——photo
要点: models 图片类型文件要使用models.ImageField(upload='文件夹名') 普通文件使用FileField 时间类型使用DatetimeField(auto_now_ad ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第4章编程练习5
#include <iostream>using namespace std;struct CandyBar{ char kind[20]; float weight; int calor ...
- nginx -s reload时出现open() "/run/nginx.pid" failed (2: No such file or directory)错误
解决办法: 找到你的nginx.conf的文件夹目录,比如我的为/etc/nginx/nginx.conf,然后运行这个 nginx -c /etc/nginx/nginx.conf命令, 再运行 ...
- iOS 开开中textfield的一些记录
1.placehold 使用KVC机制改变占位符的颜色和大小 [textField setValue:[UIColor redColor] forKeyPath:@"_placeholder ...
- u-boot-2018-09 分析 v1
下载地址: https://pan.baidu.com/s/1YcQ1XpFyzmNcr1afw1RhgQ 或者:
- dubbo+zipkin调用链监控(二)
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Java身份证归属地目录树
数据库结构: web管理界面: 目录树: 视频: 应用场景:
- Mac 删除/卸载 自己安装的python
官网pkg安装的python版本 第一步:删除框架 sudo rm -rf /Library/Frameworks/Python.framework/Versions/2.7 1 第二步:删除应用目录 ...
- Django根据现有数据库建立/更新model
Django引入外部数据库还是比较方便的,步骤如下: 创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致 运行下面代码可以自动 ...
- [Python设计模式] 第13章 造小人——建造者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚 ...