命令模式(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(); } } }
结果: