(各种设计模式的源代码在 https://github.com/mjnjust/Designmode.git ,使用utf8编码)
一、定义
将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化。
我觉得命令模式和中介者模式有一点相似,中介者模式连接的是多个类之间的联系,而命令模式联系的是客户端和类。 比如说,在软件公司给客户制作一款软件的时候,软件公司内部有很多的划分,写代码的、写页面的、做需求分析的、做测试的等等,客户向软件公司提出一个需求,软件公司就要满足客户的需求。加入软件公司和客户商量好,客户要改动代码的就去找代码组,要修改页面的就去找美工组......这样会造成客户和软件公司的沟通不变,而且客户不能确认自己的需求到底该找谁。因此,项目经理这个职位就出了,它可以很好的做为客户和软件公司沟通的桥梁。
二、实例
命令模式里面有三个角色
命令角色:定义命令,这个命令是干什么的。
执行角色:执行某个命令
调用角色:就是项目经理的角色
我们的上层模块只知道把产生一个命令,然后把命令交给调用角色,调用角色执行就OK了。
例子:软件公司有代码组和美工组,客户相应的命令有编码命令和美化命令,有一个项目经理负责传递客户的命令。
首先定义一个命令的基础类,这个类知道应该让谁去处理这个命令。
public abstract class Command {
protected Receiver receiver ;
public Command(Receiver receiver) {
this.receiver = receiver ;
}
public abstract void execute();
}
具体的命令类:美化命令和编码命令
//美化
public class ButiCommond extends Command{
public ButiCommond(Receiver receiver) {
super(receiver);
}
public ButiCommond() {
super(new ButiReceiver());
}
@Override
public void execute() {
super.receiver.execute();
}
}
//编码
public class CodeCommond extends Command {
public CodeCommond(Receiver receiver) {
super(receiver);
}
public CodeCommond() {
super(new CodeReceiver());
}
@Override
public void execute() {
super.receiver.execute();
}
}
执行者的基础类
public abstract class Receiver {
abstract public void execute();
}
具体的执行类:美化执行者和编码执行者
/
/美化执行者
public class ButiReceiver extends Receiver{
@Override
public void execute() {
System.out.println("美工组美工!");
}
}
//编码执行者
public class CodeReceiver extends Receiver {
@Override
public void execute() {
// TODO Auto-generated method stub
System.out.println("编程组进行编程!");
}
}
调用者类(项目经理)
public class Invoke {
private Command command = null ;
public void setCommand(Command command) {
this.command = command;
}
public void action() {
this.command.execute();
}
}
测试代码:
Invoke manager = new Invoke();
ButiCommond butiCommond = new ButiCommond();
CodeCommond codeCommond = new CodeCommond();
manager.setCommand(codeCommond);
manager.action();
manager.setCommand(butiCommond);
manager.action();
结果:
编程组进行编程!
美工组美工!
三、优缺点
有点: 上层模块只需要知道命令类型和调用者,而不需要知道命令是由是完成,怎么完成。
缺点:每一条命令都要写一个类,如果命令种类很多,那么项目中相似的类就会很多。