基本概念:

 Command模式也叫命令模式 ,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数,命令模式将方法调用给封装起来了。

命令模式的几个角色:

Command: 抽象命令类

ConcreteCommand: 具体命令类

Invoker: 调用者

Receiver: 接收者

Client:客户类

命令模式的优缺点:

优点

1. 降低了系统耦合度

2. 新的命令可以很容易添加到系统中去。

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。

Traders.java

package com.soyoungboy.command1;
public class Traders {
/**
* @Title: sailMineralWater
* @Description: TODO(卖矿泉水)
* @param 设定文件
* @return void 返回类型
* @throws
*/
public void sailMineralWater() {
System.out.println("卖矿泉水");
} /**
* @Title: sailIceBlackTea
* @Description: TODO(卖冰紅茶)
* @param 设定文件
* @return void 返回类型
* @throws
*/
public void sailIceBlackTea() {
System.out.println("卖冰紅茶");
}
}
抽象命令类:Command.java
/**
* @ClassName: Command
* @Description: TODO(抽象命令类)
*/
public abstract class Command {
private Traders traders; public Command(Traders traders) {
this.traders = traders;
} /**
* @return 返回 traders
**/
public Traders getTraders() {
return traders;
} /**
* @param traders 要设置的 traders
*/
public void setTraders(Traders traders) {
this.traders = traders;
} public abstract void sail(); }
具体命令类1: MineralWaterCommand.java

package com.soyoungboy.command1;
/**
*
* @ClassName: MineralWaterCommand
* @Description: TODO(具体命令类 --販賣礦泉水)
*/
public class MineralWaterCommand extends Command {
public MineralWaterCommand(Traders traders) {
super(traders);
}
@Override
public void sail() {
this.getTraders().sailMineralWater();
} }
具体命令类2:IceBlackTeaCommand.java
  1. package com.soyoungboy.command1;
    /**
    *
    * @ClassName: IceBlackTeaCommand
    * @Description: TODO(具体命令类 --販賣冰紅茶)
    */
    public class IceBlackTeaCommand extends Command { public IceBlackTeaCommand(Traders traders) {
    super(traders);
    } @Override
    public void sail() {
    this.getTraders().sailIceBlackTea();
    } }
  2. 接收类:Cashier.java

package com.soyoungboy.command1;
import java.util.ArrayList;
/**
* @ClassName: Cashier
* @Description: TODO(接收者 -- 收銀員類)
*/
public class Cashier {
public ArrayList<Command> drinks = new ArrayList<Command>(); /**
* @Title: addDrinks
* @Description: TODO(购买各种饮料)
* @param @param command 设定文件
* @return void 返回类型
* @throws
*/
public void addDrinks(Command command) {
drinks.add(command);
} /**
* @Title: removeDrinks
* @Description: TODO(不要某種飲料)
* @param @param command 设定文件
* @return void 返回类型
* @throws
*/
public void removeDrinks(Command command) {
drinks.remove(command);
} /**
* @Title: sail
* @Description: TODO(售卖各自的饮料)
* @param 设定文件
* @return void 返回类型
* @throws
*/
public void sail() {
for (Command drink : drinks) {
drink.sail();
}
} }
客户类即测试类:
package com.soyoungboy.command1;
public class Test { public static void main(String[] args) {
Cashier cashier = new Cashier();
Traders traders = new Traders();
MineralWaterCommand mineralWaterCommand = new MineralWaterCommand(traders);
IceBlackTeaCommand iceBlackTeaCommand = new IceBlackTeaCommand(traders);
//来瓶冰红茶和矿泉水
cashier.addDrinks(mineralWaterCommand);
cashier.addDrinks(iceBlackTeaCommand);
cashier.sail();
System.out.println("----------------");
//再来瓶冰红茶
cashier.addDrinks(iceBlackTeaCommand);
cashier.sail();
System.out.println("----------------");
//不要一瓶矿泉水了
cashier.removeDrinks(mineralWaterCommand);
cashier.sail();
} }
测试结果:
卖矿泉水
卖冰紅茶
----------------
卖矿泉水
卖冰紅茶
卖冰紅茶
----------------
卖冰紅茶
卖冰紅茶
 
android中的使用:
Thread, Runnable中使用命令模式:
http://www.cnblogs.com/qianxudetianxia/archive/2011/08/13/2135478.html

2015年12月19日22:35:46更新
设计模式虽然增加了类的数量和复杂度,但是使得结构更加清晰,更加高扩展,低冗余。
 
命令模式定义:
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,对请求队列或者记录请求日志,以及支持可撤销的操作。
 

设计模式--命令模式(Command)的更多相关文章

  1. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  2. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  3. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  4. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  5. 设计模式--命令模式Command(对象行为型)

    一.命令模式 将一个请求封装为一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. (1)Command类:是一个抽象类,类中对需要执行的命令进行 ...

  6. C#设计模式——命令模式(Command Pattern)

    一.概述通常来说,“行为请求者”与“行为实现者”是紧耦合的.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这些情况下,将“行为请求者”与“行为实 ...

  7. 大话设计模式--命令模式 Command -- C++实现实例

    1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...

  8. 设计模式-命令模式(Command)

    关注公众号 JavaStorm 获取更多成长. 大约需要6分钟读完.建议收藏后阅读. 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日 ...

  9. 深入浅出设计模式——命令模式(Command Pattern)

    模式动机 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请 ...

  10. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

随机推荐

  1. 利用HTML5的devicemotion事件实现手机摇一摇抽奖,年会抽奖

    摇一摇JS脚本逻辑:接下来是移动端JS脚本逻辑的实现,摇一摇的实现需借助html5新增的devicemotion事件,获取设备在位置和方向上的改变速度的相关信息,该事件的基本使用如下: if (win ...

  2. tabindex属性

    1. tabindex的用法: 可以设置tab键在控件中的移动顺序. 以下元素支持tabindex属性:<a> <input> <textarea> <are ...

  3. 解决,Incorrect table definition; there can be only one auto column and it must be defined as a key

    今天在迁移项目时,操作数据库报错: Incorrect table definition; there can be only one auto column and it must be defin ...

  4. svg滤镜学习

    SVG滤镜绝对称得上是他最强大的功能之一,在不影响任何文档结构的前提下,允许你给你的矢量图形添加各种专业视觉效果,我个人给他的定义就是,把PS装到了网页上. 一.  SVG滤镜的原理 基本原理描述太多 ...

  5. CodeForces 213B Numbers

    $dp$,组合数. $dp[i][j]$表示只用数字$i$,$i+1$,$i+2$......,$9$,凑成长度为$j$的并且数字$i$到$9$符合要求的方案数.只要枚举数字$i$用几个就可以转移了. ...

  6. CodeForces 721C Journey

    $dp$,拓扑排序. 记$dp[i][j]$表示走到节点$i$,走过了$j$个点的最小时间,然后就可以递推了.要注意的是节点$1$的入度一开始不一定等于$0$. #pragma comment(lin ...

  7. [HMLY]10.深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用

    前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如Retain Circle的问题. 目录 1.Retain ...

  8. Kattis - Aaah!

    Aaah! Photo by Unknown Jon Marius shouted too much at the recent Justin Bieber concert, and now need ...

  9. cocos2d环境及创建一个自己的项目

    一. mac环境:     1.在终端操作,准备好mac系统下的sdk,adt,ndk,ant文件,放在自己的目录中     2.进入mac终端,输入: vim ~/.bash_profile 然后回 ...

  10. 采用rest接口对接而非webservice

    代码示例 public static String queryForCTI(String url){ String targetURL = getCTIurl()+"/"+url; ...