定义:Command模式也叫命令模式,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及参数调用。
应用场景:在面向对象的设计过程中,一个对象调用另一个对象,一般情况一下的调用过程是:创建目标实例;设置调用参数;调用。
但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门类称作command类。整个调用过程比较复杂,或者存在诸多的这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
- 调用前后需要对调用类数据进行某些处理。
- 调用前后需要进行某些额外的处理,比如日志,缓存,记录历史操作等。
结构:
命令模式(Command)的参与者
1.Command
声明执行操作的接口。
2.ConcreteCommand
将一个接收者对象绑定于一个动作。
调用接收者相应的操作,以实现Execute。
3.Client
创建一个具体命令对象并设定它的接收者。
4.Invoker
要求该命令执行这个请求。
5.Receiver
知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。
代码演示:
第一步:定义Command,声明执行操作的接口
/**
* @version Id: Command.java, v 0.1 2019\1\4 0004 16:31 东方小猪 Exp $$
* @author: 东方小猪
* @Desprice:
*/
public abstract class Command {
private Peddler peddler;
protected Command(Peddler peddler) {
this.peddler = peddler;
}
public abstract void sail();
public Peddler getPeddler() {
return peddler;
}
}
第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。
/**
* @version Id: AppleCommand.java, v 0.1 2019\1\4 0004 16:32 东方小猪 Exp $$
* @author: 东方小猪
* @Desprice:
*/
public class BananaCommand extends Command{
public BananaCommand(Peddler peddler) {
super(peddler);
}
@Override
public void sail() {
this.getPeddler().sailBanana();
}
}
/**
* @version Id: AppleCommand.java, v 0.1 2019\1\4 0004 16:32 东方小猪Exp $$
* @author: 东方小猪
* @Desprice:出售苹果
*/
public class AppleCommand extends Command{
public AppleCommand(Peddler peddler) {
super(peddler);
}
@Override
public void sail() {
this.getPeddler().sailApple();
}
}
第三步:定义Receiver,知道如何实现与执行一个请求相关的操作
/**
* @version Id: Peddler.java, v 0.1 2019\1\4 0004 16:16 东方小猪Exp $$
* @author:东方小猪
* @Desprice:超市售货具体执行者
*/
public class Peddler {
public void sailApple(){
System.out.println("卖苹果");
}
public void sailBanana(){
System.out.println("卖香蕉");
}
}
第四步:定义Invoker,要求该命令执行这个请求。
/**
* @version Id: Waiter.java, v 0.1 2019\1\4 0004 17:01 东方小猪Exp $$
* @author: 东方小猪
* @Desprice:服务导购员
*/
public class Waiter {
private Command command;
public Waiter(Command command) {
this.command = command;
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public void serve(){
this.command.sail();
}
}
第五步:定义Clien,我们来测试一下我们的命令模式
/**
* @version Id: MainClass.java, v 0.1 2019\1\4 0004 16:19 东方小猪Exp $$
* @author:东方小猪
* @Desprice:
*/
public class MainClass {
public static void main(String[] args){
Peddler peddler=new Peddler();
Command appleCommand=new AppleCommand(peddler);
Command bananaCommand=new BananaCommand(peddler);
Waiter waiter=new Waiter(appleCommand);
Waiter waiter1=new Waiter(bananaCommand);
waiter.serve();
waiter1.serve();
}
}
卖苹果
卖香蕉
Process finished with exit code 0