一、模式提出
将一个请求封装为一个对象,从而使你可用不同的请求对客户惊醒参数化;请求排队或记录请求日志,以及支持可撤销操作。
1、它能够较容易地设计一个命令队列;
2、在需要的情况下,可以较容易的将命令记入日志;
3、允许接受请求的一方是否要否决请求
二、业务逻辑背景
男孩子有一个女孩子,然后女孩子要自己的男友做一列相关的事情如:买鲜花给他、陪她逛街、打个小kiss等等,即女孩子下发命令,男孩子如何执行
三、UML图解
四、代码详解
客户端调用
package command.com.cn;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
new MM().order(new Boy());//女朋友给自己的男友下发命令
}
}
第一个类男友类比较痛苦为自己的女友干这样的事情:哈哈
package command.com.cn;
import java.util.ArrayList;
import java.util.List;
public class Boy {
private String name;
private List<Command> commands=new ArrayList<Command>();
//添加女友要求的命令
public void addCommand(Command c){
this.commands.add(c);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 执行女友相关的命令
*/
public void executeCommands() {
for(Command c:commands){
c.execute();
}
}
}
第二个类娇气的女友要男生下发命令,太不公平了
package command.com.cn;
public class MM {
private String name;
//执行命令的是妹妹,所以在此方法要代理男友执行命令
public void order(Boy b) {
b.addCommand(new ShoppingComand());//妹妹要求男友买衣服
b.addCommand(new HugCommand());//妹妹要男友亲嘴
b.executeCommands();//执行妹妹做的要求
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
第三个是一个命令接口
package command.com.cn;
public abstract class Command {
public abstract void execute();//让女友的男友执行行动
public abstract void undo();
}
第四个男友执行亲嘴行动的操作类
package command.com.cn;
public class HugCommand extends Command{
@Override
public void execute() {
System.out.println("month-to-month");
}
@Override
public void undo() {
System.out.println("on way");
}
}
第五个男友执行逛商场行动的操作类
package command.com.cn;
public class ShoppingComand extends Command {
@Override
public void execute() {
System.out.println("go shopping buy clothing");
}
@Override
public void undo() {
System.out.println("Don't shopping");
}
}
Test