命令模式

来源:互联网 发布:中邮网络培训学院官网 编辑:程序博客网 时间:2024/06/06 09:19

高度概括

将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。


概述

在许多设计中,经常涉及到一个对象请求另一个对象调用其方法达到某种目的,如果请求者不希望或无法与被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。

命令模式的核心就是使用命令对象封装方法调用,即将被请求者的引用封装到命令对象中,这样一来,当请求者需要完成某项任务时,只需与命令对象打交道,即让命令对象调用那个封装了被请求者执行请求的那个方法。


命令模式中包括四种角色

接收者(Receiver):接收者是一个类的实例 该实例负责执行与请求相关的操作。

命令接口(Commond):规定了用来封装”请求”的若干个方法。

具体命令(ConcreteCommand):具体命令是实现命令接口的类的实例。具体命令必须实现命令中的方法。

请求者(Invoker) : 请求者是一个包含了command接口变量的类的实例。请求者中的Command接口的变量可以存放任何具体命令的引用。请求者负责用具体命令,让具体命令执行那些封装了”请求”的方法。


优点

  1. 降低对象之间的耦合度。
  2. 满足”开-闭原则”,新的命令可以很容易地加入到系统中。
  3. 可以将具体命令保存到持久化的媒介中,在需要时可以再次执行 则使用命令模式可以记录日志
  4. 可以将请求进行排队 每个请求对应一个具体命令 则可以按一定顺序执行这些具体命令

缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。


适用场景

  1. 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
  2. 系统需要在不同的时间指定请求、将请求排队和执行请求。
  3. 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
  4. 系统需要将一组操作组合在一起,即支持宏命令。

应用

按主人对小狗的命令 如坐下,捡球,

Command.java

public interface Command {    public abstract void execute();}

Dog.java

public class Dog {    private String name;    Dog(String name){        this.setName(name);    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public void doSitDown() {        System.out.println(this.getName() + "坐下了");    }    public void doSearchBall(){        System.out.println(this.getName() + "去捡球了");    }}

DogCommand.java

public class DogCommand implements Command{    Dog dog;    DogCommand(Dog dog){        this.dog = dog;    }    @Override    public void execute() {        // TODO Auto-generated method stub        dog.doSitDown();        dog.doSearchBall();    }}

Master.java

public class Master {    private Command command;    public void setCommand(Command command){        this.command = command;    }    public void startCommand(){        command.execute();    }}

Test.java

public class Test {public static void main(String [] args){    Dog dog = new Dog("Tom");    Command command = new DogCommand(dog);    Master m = new Master();    m.setCommand(command);    m.startCommand(); }}

测试结果为:
Tom坐下了
Tom去捡球了

总结:

  1. 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
  2. .命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
  3. 命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

本人还是初学者 如有错误,希望大家指出 多多交流

参考:http://blog.csdn.net/jason0539