命令模式就是将一组操作得调用封装在一个对象外面,这个对象称作命令对象。

例如咱们能够有一个专门用于开启、敞开电器的命令,通过调用这命令就能够开关电器。

system start 冰箱system close 冰箱system start 空调system close 空调

那么咱们能够写一个对于电器的命令类,在创建对象的时候能够与具体电器的组合实现对具体电器的管制。

也就是咱们为您能够将system startsystem close封装到一个对象中,而后对象能够与空调、冰箱等家电组合实现system close 空调的性能。

在命令模式中有以下角色

  • 形象命令:所有命令的父类,定义执行命令的形象接口,并且申明被调用者成员与命令绑定。
  • 具体命令:实现具体的执行细节。
  • 形象被调用者:定义被调用者可被调用的性能办法。
  • 具体调用者:实现具体产品的被调用办法的具体细节。
  • 调用者:设置具体的调用命令,并实现调用办法。

上面通过一个软件的实例来实现命令模式

形象命令

public abstract class Command {    Software software;    public Command(Software software) {        this.software = software;    }    abstract void execute();}

具体命令 - 开、操作、关

public class OpenSoftwareCommand extends Command{    public OpenSoftwareCommand(Software software) {        super(software);    }    @Override    void execute() {        software.open();    }}
public class OperateSoftwareCommand extends Command{    public OperateSoftwareCommand(Software software) {        super(software);    }    @Override    void execute() {        software.operate();    }}
public class CloseSoftwareCommand extends Command{    public CloseSoftwareCommand(Software software) {        super(software);    }    @Override    void execute() {        software.close();    }}

形象被调用者 - 软件

public interface Software {    /**     * 关上软件     */    void open();    /**     * 操作软件     */    void operate();    /**     * 敞开软件     */    void close();}

具体被调用者 - 微信

public class Wechat implements Software{    @Override    public void open() {        System.out.println("关上微信");    }    @Override    public void operate() {        System.out.println("微信聊天");    }    @Override    public void close() {        System.out.println("推出微信");    }}

调用者

public class Invoker {    Command command;    public Invoker() {    }    public void setCommand(Command command) {        this.command = command;    }    public void execute(){        command.execute();    }}

测试

public class CommandTest {    @Test    public void test(){        Invoker invoker = new Invoker();        Command command = new OpenSoftwareCommand(new Wechat());        invoker.setCommand(command);        invoker.execute();        command = new OperateSoftwareCommand(new Wechat());        invoker.setCommand(command);        invoker.execute();    }}======后果======关上微信微信聊天