首页 > 代码库 > 设计模式----命令模式

设计模式----命令模式

为了执行某个方法,会直接去调用这个方法,有这么一种情况并不适用于直接去调用方法,那就是未来执行某个方法系统必须满足一个特定的执行顺序或者语境,但是开发者没法去控制这个顺序时,解决这个问题的一个方案就是把方法分装在一个对象当中,这就是命令模式。

相当于有传令官,对整个命令进行封装,然后在依照命令顺序执行。

定义:讲一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化,对请求排队或记录请求日志,并支持可撤销操作。

基本代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class Command {
    public abstract void execute();
    protected Receiver receiver;
    public Command(Receiver receiver){
        this.receiver = receiver;
    }
}
public class ConcreteCommand extends Command {
 
    public ConcreteCommand(Receiver receiver){
        super(receiver);
    }
    @Override
    public void execute() {
        receiver.action();
    }
 
}

传达着代码:

1
2
3
4
5
6
7
8
9
public class Invoker {
    private Command command;//这里可以很方便的形成一个命令队列,对不要的命令可以删除和增加
    public void setCommand(Command command) {
        this.command = command;
    }
    public void executeCommand(){
        command.execute();
    }
}
1
2
3
4
5
6
//命令执行者
public class Receiver {
    public void action(){
        System.out.println("execute the request");
    }
}

客户端:

1
2
3
4
5
6
7
public static void main(String[] args) {
        Receiver receiver= new Receiver();
        Command command = new ConcreteCommand(receiver);
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        invoker.executeCommand();
    }

命令模式的优点很明显的,首先,命令模式可以很容易的设计一个命令的队列,可以较方便的将命令记录到日志中去。可以允许接受请求的哪一方来决定是否要否决请求,可以比较容易的实现对请求的撤销和重做。最后,可以比较容易地实现对请求的撤销和重做。

命令模式适用于以下几种情况:

1、当需要抽象出待执行的动作以便参数化某个对象时。

2、当需要在不同的时刻执行、排列以及执行请求时。

3、当系统需要支持取消操作时。

4、当系统需要记录、修改日志时。

命令模式可以将发送者和接收者完全解耦,发送者和接收者之间不会出现直接引用关系,发送请求的对象只需要知道如何去发送请求,而不必知道如何去完成请求,这就是命令模式的模式动机。

命令模式允许请求的一方和接收的一方相互独立开来,这使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是如何被接收的。以及操作是否被执行,以及是怎么被执行的等。命令模式的关键就在于引入了抽象命令接口,并且发送者针对抽象命令接口进行编程,只有实现了抽象命令接口的具体命令才能与接收者相互关联。

命令模式的优点如下:

1、降低了系统的耦合度。

2、新的命令可以很容易地加入到当前系统中。

3、可以比较容易地设计一个命令队列和组合命令。

4、可以方便地实现对请求的撤销和重做。

?

 

设计模式----命令模式