命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式Demo:
/**
* 2018年4月6日下午11:15:26
*/
package com.Designpattern;
import java.util.ArrayList;
import java.util.List;
/**
* @author xinwenfeng
*
*/
public class TestCommand {
/**
* @param args
*/
public static void main(String[] args) {
Receiver r = new Receiver();
MyCommand mc1 = new Command1(r);
MyCommand mc2 = new Command2(r);
CommandInvoker invoker1 = new CommandInvoker();
invoker1.setCommand(mc1);
invoker1.excuteCommand();
invoker1.setCommand(mc2);
invoker1.excuteCommand();
System.out.println("=====================");
CommandInvoker2 invoker2 = new CommandInvoker2();
invoker2.addCommand(mc1);
invoker2.addCommand(mc2);
invoker2.excuteCommand();
System.out.println("remove mc1");
invoker2.removeCommand(mc1);
invoker2.excuteCommand();
}
}
class Receiver{
public void runCommand(String s) {
System.out.println("执行命令:"+s);
}
}
abstract class MyCommand{
protected Receiver receiver;
public MyCommand(Receiver r) {
this.receiver = r;
}
abstract void excute();
}
class Command1 extends MyCommand{
public Command1(Receiver r) {
super(r);
}
@Override
void excute() {
receiver.runCommand("ls -hl");
}
}
class Command2 extends MyCommand{
public Command2(Receiver r) {
super(r);
}
@Override
void excute() {
receiver.runCommand("nohup java -jar HelloWorld.jar &");
}
}
class CommandInvoker{
private MyCommand command;
public void setCommand(MyCommand command) {
this.command = command;
}
public void excuteCommand() {
command.excute();
}
}
class CommandInvoker2{
private List<MyCommand> commandList = new ArrayList<>();//命令列表
public void addCommand(MyCommand command) {//添加命令
commandList.add(command);
}
public void removeCommand(MyCommand command) {//撤销命令
commandList.remove(command);
}
public void excuteCommand() {
for(MyCommand c:commandList) {//统一执行多条命令
c.excute();
}
}
}
结果: