命令模式:将“请求”封装成对象,以便使用不同的请求,队列,或者日志来参数化其他对象,命令模式也支持可撤销的操作。
每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:
(1)命令模式使新的命令很容易地被加入到系统里。
(2)允许接收请求的一方决定是否要否决请求。
(3)能较容易地设计一个命令队列。
(4)可以容易地实现对请求的撤销和恢复。
(5)在需要的情况下,可以较容易地将命令记入日志。
public interface Command {
void execute();
void unDo();
}
public class CreateConmand implements Command{
private Reicever reicever;
public CreateConmand(Reicever reicever)
{
this.reicever=reicever;
}
@Override
public void execute() {
// TODO Auto-generated method stub
reicever.action();
}
@Override
public void unDo() {
// TODO Auto-generated method stub
reicever.undo();
}
}
public class Invoker {
private Command command;
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public void executeConmand()
{
command.execute();
}
public void undoConmand()
{
command.unDo();
}
}
public class Reicever {
public void action()
{
System.out.println("执行命令");
}
public void undo()
{
System.out.println("撤销命令");
}
}
public static void main(String[] args)
{
Reicever reicever=new Reicever();
Command command=new CreateConmand(reicever);
Invoker invoker=new Invoker();
invoker.setCommand(command);
invoker.executeConmand();
invoker.undoConmand();
}
在程序运行的时候,Invoker只需要发送命令,不用知道接收者是谁,也不需要知道接受者是谁,只需要知道命令执行了没有就足以。
执行结果:
执行命令
撤销命令