版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangchengming1/article/details/84927843
- 命令模式定义
命令模式是一个高内聚的模式。Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations. 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 - 命令模式通用类图
- 命令模式五个主要角色
- Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
- ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
- Invoker类:调用者,负责调用命令。
- Receiver类:接收者,负责接收命令并且执行命令。
- Client类:最终的客户端调用类。
- 命令模式通用代码
通用Receiver
public abstract class Receiver {
public abstract void dth();
}
具体的接受者
public class ConcreteReceiver1 extends Receiver{
@Override
public void dth() {
// TODO
}
}
public class ConcreteReceiver2 extends Receiver{
@Override
public void dth() {
// TODO
}
}
抽象Command类
public abstract class Command {
public abstract void execute();
}
具体Command类
public class ConcreteCommand1 extends Command {
private Receiver receiver;
public ConcreteCommand1(Receiver _receiver) {
this.receiver = _receiver;
}
@Override
public void execute() {
this.receiver.dth();
}
}
public class ConcreteCommand2 extends Command {
private Receiver receiver;
public ConcreteCommand2(Receiver _receiver) {
this.receiver = _receiver;
}
@Override
public void execute() {
this.receiver.dth();
}
}
Invoker类
public class Invoker {
private Command command;
public void setCommand(Command _command) {
this.command = _command;
}
public void action() {
this.command.execute();
}
}
调用场景类
public class Client {
public static void main(String[] args) {
Receiver receiver = new ConcreteReceiver1();
Command command = new ConcreteCommand1(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
}
}
针对以上代码可以这样子理解:命令模式本质就是对命令的封装,把一系列的操作写到一个方法中,然后供客户端调用就行了。命令模式的执行步骤应该是这样的:首先是调用者类,然后是命令类,最后是接收者类。命令模式的精髓就是:把命令的调用者与执行者分开,使双方不必关心对方是如何操作的
。
- 命令模式实例类图
其实在实际生活中有很多例子可以体现命令模式,笔者今天以小王去饭店吃饭这个例子,用命令模式实现以下。
首先小王来到饭店,看完菜单进行点单,厨师收到菜单,然后开始烹饪。
- 命令模式实例代码
首先定义抽象接收者
/**
* 相当于接收者
*
* @author cm_wang
*
*/
public abstract class Cook {
/**
* 厨师烹饪
*/
public abstract void cooking();
/**
* 收到菜单
*/
public abstract void say();
}
真实接收者CookA
public class CookA extends Cook {
@Override
public void cooking() {
System.out.println("厨师A开始做饭。。。");
}
@Override
public void say() {
System.out.println("厨师A收到菜单。。。");
}
}
抽象命令类
public abstract class Command {
public abstract void orderList();
}
具体命令类
public class CookCommand extends Command {
private Cook cook;
public CookCommand(Cook _cook) {
this.cook = _cook;
}
@Override
public void orderList() {
cook.cooking();
}
}
Invoker类
/**
* 相当于Invoker
*
* @author cm_wang
*
*/
public class Consumer {
static void order() {
System.out.println("小王点菜。。。");
}
private Command command;
public void setCommand(Command _command) {
this.command = _command;
}
public void action() {
this.command.orderList();
}
}
调用类
public class Client {
public static void main(String[] args) {
Cook cook = new CookA();
Command command = new CookCommand(cook);
Consumer cosumer=new Consumer();
Consumer.order();
cook.say();
cosumer.setCommand(command);
cosumer.action();
}
}
输出结果
小王点菜。。。
厨师A收到菜单。。。
厨师A开始做饭。。。
这样子就用命令模式实现了以上的例子。
- 命令模式的优缺点
- 命令模式封装性良好,是一种高内聚的模式。
- 命令模式可扩展性良好。
- 不好的地方就是当命令较多的时候很繁琐,所以还是看场景使用。
- 命令模式总结
- 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
- 命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
参考书籍:设计模式之禅
实例代码放在这里。