Command(命令)模式属于对象行为型模式;
Command命令模式通过将请求本身封装成一个对象,以期向未知的对象提出请求.并且这个对象可被存储并像其它的对象一样被传递.
实现Command模式的关键在于抽象出一个Command类;这个类定义了一个可执行操作的接口(抽象方法).具体的Command子类依赖一个接收都类的实例变量,在具体的Command子类实现抽象方法时调用接收者的动作以完成相应的操作.
㈠意图:
将一个请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排除或者记录请求日志;以及支持可撤销的操作;
-- GOF设计模式
功力暂时不够,不是很懂这句话的意思.
㈡理解:
必须向某对象提交请求;但是并不知道关于被请求的操作或请求的执行都的任何信息;
比如:我们在界面上提供一个按钮或者菜单;我们只是规定了要想使按钮(菜单)执行某些动作,必须调用它的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();
- }
- }
- }