第0章:简介
命令模式定义:将一个请求封装为一个对象,从而你可以用不同的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销操作
命令模式本质:封装请求
参考:http://chjavach.iteye.com/blog/705916 ,研磨设计模式(书籍),大话设计模式(书籍)
模式图:
待补充第1章:实践
第0节:单命令模式
(1)接收命令的接口(Receiver.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 接收命令的接口,正在的执行者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:17 */ public interface Receiver { /** * 执行操作 */ public void someMethod(); } |
(2)接收者A(ReceiverImplA.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 接收者A,正在的执行者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:19 */ public class ReceiverImplA implements Receiver { @Override public void someMethod() { System.out.println("接收者A收到命令并执行操作"); } } |
(3)接收者B(ReceiverImplB.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 接收者B,正在的执行者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:21 */ public class ReceiverImplB implements Receiver { @Override public void someMethod() { System.out.println("接收者B收到命令并执行操作"); } } |
(4)命令接口(Command.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 命令接口,单命令模式 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:12 */ public interface Command { /** * 发命令 */ public void execute(); } |
(5)命令实现类(CommandImpl.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 命令实现类,单命令模式 * * 命令模式的定义:将一个请求封装为一个对象,从而你可以用不同的请求对客户进行参数化,对请求队列或记录请求日志,以及支持可撤销操作 * 命令模式的本质:封装请求 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:14 */ public class CommandImpl implements Command { //持有命令的接收者对象 private Receiver receiver; /** * 构造器,传入相应的命令接收者对象 * @param receiver */ public CommandImpl(Receiver receiver){ this.receiver = receiver; } /** * 发命令 */ @Override public void execute() { System.out.println("发命令时命令实现类的附加操作"); //调用接收者去真正执行操作 receiver.someMethod(); } } |
(6)命名调用者(CommandInvoker.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 命名调用者,命令发起者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:22 */ public class CommandInvoker { //持有命令对象 private Command command; /** * 设置命令对象 * @param command */ public void setCommand(Command command){ this.command = command; } /** * 调用执行命令 */ public void executeCommand(){ //调用发命令 command.execute(); } } |
(7)客户端测试(Client.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 客户端测试,单命令模式,每次只能执行一个命令 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:33 */ public class Client { public static void main(String args[]){ //接收者 Receiver receiverA = new ReceiverImplA(); Receiver receiverB = new ReceiverImplB(); //命令对象 Command commandA = new CommandImpl(receiverA); Command commandB = new CommandImpl(receiverB); //调用者调用命令,A和B命令每次只能调用其中一个,单命令模式 CommandInvoker commandInvoker = new CommandInvoker(); //设置为A命令 commandInvoker.setCommand(commandA); //调用A命令 commandInvoker.executeCommand(); //设置为B命令 commandInvoker.setCommand(commandB); //调用B命令 commandInvoker.executeCommand(); } } |
第1节:多命令模式(宏命令模式)
(1)接收命令的接口(Receiver.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 接收命令的接口,正在的执行者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:17 */ public interface Receiver { /** * 执行操作 */ public void someMethod(); } |
(2)接收者A(ReceiverImplA.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 接收者A,正在的执行者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:19 */ public class ReceiverImplA implements Receiver { @Override public void someMethod() { System.out.println("接收者A收到命令并执行操作"); } } |
(3)接收者B(ReceiverImplB.java)
package com.mcc.core.designPattern.behavior.command.singleCommand; /** * 接收者B,正在的执行者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:21 */ public class ReceiverImplB implements Receiver { @Override public void someMethod() { System.out.println("接收者B收到命令并执行操作"); } } |
(4)命令接口(Command.java)
package com.mcc.core.designPattern.behavior.command.multiCommand; /** * 命令接口,多命令模式 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:12 */ public interface Command { /** * 发命令 */ public void execute(); } |
(5)命令实现类A(CommandImplA.java)
package com.mcc.core.designPattern.behavior.command.multiCommand; /** * 命令实现类A * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:48 */ public class CommandImplA implements Command { //持有命令的接收者对象 private Receiver receiver; /** * 构造器,传入相应的命令接收者对象 * @param receiver */ public CommandImplA(Receiver receiver){ this.receiver = receiver; } /** * 发命令 */ @Override public void execute() { System.out.println("发命令时命令实现类的附加操作"); //调用接收者去真正执行操作 receiver.someMethod(); } } |
(6)命令实现类B(CommandImplB.java)
package com.mcc.core.designPattern.behavior.command.multiCommand; /** * 命令实现类B * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:48 */ public class CommandImplB implements Command { //持有命令的接收者对象 private Receiver receiver; /** * 构造器,传入相应的命令接收者对象 * @param receiver */ public CommandImplB(Receiver receiver){ this.receiver = receiver; } /** * 发命令 */ @Override public void execute() { System.out.println("发命令时命令实现类的附加操作"); //调用接收者去真正执行操作 receiver.someMethod(); } } |
(7)多命令对象(MultiCommandImpl.java)
package com.mcc.core.designPattern.behavior.command.multiCommand; import java.util.ArrayList; import java.util.Collection; /** * 多命令对象,也叫宏命令对象,用来管理所有命令 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:51 */ public class MultiCommandImpl implements Command { //持有多个命令对象 private Collection<Command> commands = new ArrayList<Command>(); /** * 注册命令 * @param command */ public void addCommand(Command command){ commands.add(command); } /** * 发命令,多条命令的总控 */ @Override public void execute() { for(Command command : commands){ //发命令 command.execute(); } } } |
(8)宏命令调用者(MultiCommandInvoker.java)
package com.mcc.core.designPattern.behavior.command.multiCommand; /** * 宏命令调用者 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 上午11:59 */ public class MultiCommandInvoker { //持有宏命令 private MultiCommandImpl multiCommand = new MultiCommandImpl(); /** * 调用执行命令 */ public void executeCommand(){ //接收者 Receiver receiverA = new ReceiverImplA(); Receiver receiverB = new ReceiverImplB(); //命令对象 Command commandA = new CommandImplA(receiverA); Command commandB = new CommandImplB(receiverB); //注册命令 multiCommand.addCommand(commandA); multiCommand.addCommand(commandB); //调用宏命令 multiCommand.execute(); } } |
(9)客户端测试(Client.java)
package com.mcc.core.designPattern.behavior.command.multiCommand; /** * 客户端测试 * * @author <a href="mailto:417877417@qq.com">menergy</a> * DateTime: 14-3-16 下午12:04 */ public class Client { public static void main(String args[]){ //调用者调用宏命令 MultiCommandInvoker multiCommandInvoker = new MultiCommandInvoker(); multiCommandInvoker.executeCommand(); } } |