头图

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

例如我们可以有一个专门用于开启、关闭电器的命令,通过调用这命令就可以开关电器。

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();
    }
}
======结果======
打开微信
微信聊天

eacape
205 声望8 粉丝

JAVA 攻城狮


« 上一篇
中介者模式
下一篇 »
责任链模式