学习设计模式之命令模式

命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化。

类结构图
在这里插入图片描述
Invoker
要求该命令执行这个请求。
Command
用来声明执行命令的接口。
ConcreteCommand
将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现 Execute。
Receiver
就是接收命令的角色具体实施一个请求的操作,任何类都可能作为一个接收者。

代码示例
这样就好比我们去饭馆吃饭。
Receiver 就是具体处理我们命令的人好比厨师.
Command 就像我们点菜的命令。
Invoker 就好比服务员。我们来实现一下。

public interface Command {

    void setReceiver(Receiver receiver);

    String getContent();

    void execute(Command command);
}

public interface Receiver {
    void action(Command command);
}

public class ConcreteReceiver implements Receiver {
    @Override
    public void action(Command command) {
        System.out.println("厨师 ConcreteReceiver 正在执行 " + command.getContent());
    }
}

public class Waiter {
    private List<Command> commands = new ArrayList();

    public void addCommand(Command command) {
        this.commands.add(command);
    }

    public void delCommand(Command command) {
        this.commands.remove(command);
    }

    public void executeCommand() {
        for (Command c : commands) {
            c.execute(c);
        }
    }
}

客户端示例

public class Client {
    public static void main(String[] args) {
        Receiver receiver = new ConcreteReceiver();
        Command command = new Command() {
            private Receiver receiver;

            @Override
            public void setReceiver(Receiver receiver) {
                this.receiver = receiver;
            }

            @Override
            public String getContent() {
                return "西红柿炒鸡蛋!";
            }

            @Override
            public void execute() {
                this.receiver.action(this);
            }
        };
        command.setReceiver(receiver);
        
        Waiter waiter = new Waiter();
        waiter.addCommand(command);
        waiter.executeCommand();
    }
}

运行结果

厨师 ConcreteReceiver 正在执行 西红柿炒鸡蛋!

Process finished with exit code 0

优点
代码解耦,调用者和接收者没有依赖关系,只需要了解到对应的 Command 即可不需要了解谁去做这个菜,怎么做这个菜。

缺点
类会变得很多,如果一个操作需要很多命令在一起,那么就需要实例化 N 个 Command 实现类。

posted @ 2019-03-11 11:24  一定要细心  阅读(97)  评论(0编辑  收藏  举报