Command(命令)模式属于对象行为型模式;java
Command命令模式经过将请求自己封装成一个对象,以期向未知的对象提出请求.而且这个对象可被存储并像其它的对象同样被传递.设计模式
实现Command模式的关键在于抽象出一个Command类;这个类定义了一个可执行操做的接口(抽象方法).具体的Command子类依赖一个接收都类的实例变量,在具体的Command子类实现抽象方法时调用接收者的动做以完成相应的操做.框架
㈠意图:ide
将一个请求封装成对象,从而使你可用不一样的请求对客户进行参数化;对请求排除或者记录请求日志;以及支持可撤销的操做;this
-- GOF设计模式spa
功力暂时不够,不是很懂这句话的意思.设计
㈡理解:日志
必须向某对象提交请求;可是并不知道关于被请求的操做或请求的执行都的任何信息; 对象
好比:咱们在界面上提供一个按钮或者菜单;咱们只是规定了要想使按钮(菜单)执行某些动做,必须调用它的Click方法;这时咱们就能够考虑用Command模式;和接口回调有点类似;都是将具体的执行交由客户来完成;接口
㈢UML图:
㈣场景描述:
考虑一个计算器模型的设计:
计算器的大体框架咱们做为厂商能够提供出来;一排排的按钮和点击这些按钮能够触发一些操做;(做为计算器模型的硬件提供商) Command(抽象类)
计算器的软件提供商则会对计算器的具体按钮进行封装; 具体Command类
每个不一样类型的Command类会执行相应的动做;进行加,减,乘,除的操做;(调用真正地处理方法)
而传入的数据则对应每一个具体的接收者.(加1, 加2, 加3, 加4)
没有按"="号以前就至关于维护在一个Invoker,去不断地接收命令.
(五)代码实现:
- /**
- * Command模式中的command抽象类
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public abstract class Command {
- protected abstract void command();
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class AddCommand extends Command {
- private AddReceiver addReceiver;
- public AddCommand(AddReceiver addReceiver)
- {
- this.addReceiver = addReceiver;
- }
- @Override
- protected void command() {
- addReceiver.add();
- }
- }
- /**
- * Command模式中的Receiver操做;知道如何实施和执行一个相关的操做;任何类均可能做为一个接收者
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class AddReceiver {
- public void add()
- {
- System.out.println(" 加上一 ");
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- *
- * @author hubert
- *
- */
- public class SubtractionCommand extends Command{
- private SubtractionReceiver subtractionReceiver;
- public SubtractionCommand(SubtractionReceiver subtractionReceiver)
- {
- this.subtractionReceiver = subtractionReceiver;
- }
- @Override
- protected void command() {
- // TODO Auto-generated method stub
- subtractionReceiver.subtract();
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author hubert
- *
- */
- public class Invoker {
- private List<Command> commandSeq = new ArrayList<Command>();
- public List<Command> getCommandSeq() {
- return commandSeq;
- }
- public void setCommandSeq(List<Command> commandSeq) {
- this.commandSeq = commandSeq;
- }
- public List<Command> addCommand(Command command)
- {
- commandSeq.add(command);
- return commandSeq;
- }
- public List<Command> removeCommand(Command command)
- {
- if(this.commandSeq != null && this.commandSeq.contains(command))
- {
- commandSeq.remove(command);
- }
- return commandSeq;
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class SubtractionReceiver {
- public void subtract()
- {
- System.out.println(" 减小一 ");
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class Client {
- /**
- * @param args
- */
- public static void main(String[] args) {
- AddReceiver addReceiver = new AddReceiver();
- Command addCommand = new AddCommand(addReceiver);
- SubtractionReceiver subtractionReceiver = new SubtractionReceiver();
- Command subCommand = new SubtractionCommand(subtractionReceiver);
- Invoker invoker = new Invoker();
- invoker.addCommand(addCommand).add(subCommand);
- for(Command command : invoker.getCommandSeq())
- {
- command.command();
- }
- }
- }