命令模式:客户端和Invoker之间的关系

时间:2013-10-30 11:39:13

标签: design-patterns uml

我正在研究设计模式,我对命令模式有疑问:我不明白为什么我见过的每个类图(例如,看看这个:http://en.wikipedia.org/wiki/Command_pattern或{{ 3}})没有显示客户端和Invoker之间的关系,因为客户端创建了一个Invoker类的实例。

提前致谢。

编辑: 有人可以发布一个简单的例子,说明如何实现一个不实例化Invoker的Client,但它只负责处理具体的命令和接收器吗?

1 个答案:

答案 0 :(得分:1)

这是因为可能存在关系,但关系没有必要。

示例:

首先我们有一个Command界面

public interface Command {
    void execute();
}

有一些实施......

public class CopyFilesCommand implements Command {

    @Override
    public void execute() {
        // copy some files
    }
}

public class ZipFilesCommand implements Command {

    @Override
    public void execute() {
        // collect the copied files to a zip archive
    }
}

public class MailZipFileCommand implements Command {

    @Override
    public void execute() {
        // mail the zip file to some address
    }
}

现在想象一下具有基本配置的服务器应用程序

public class Config {
    private static final Config INSTANCE = new Config();

    private List<Command> commands = new ArrayList<>();

    private Config() {
        // intentionally empty
    }

    public static List<Command> getCommands() {
        return Collections.unmodifiableList(INSTANCE.commands);
    }

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

客户端方法现在可以像这样设置配置

public class Client {
    public void setUpConfig() {
        Config.addCommand(new CopyFilesCommand());
        Config.addCommand(new ZipFilesCommand());
        Config.addCommand(new MailZipFileCommand());
    }
}

然后在我们的服务器应用程序中运行的某些服务可以接受命令并调用它们

public class Invoker implements Runnable {

    @Override
    public void run() {
        for (Command command : Config.getCommands()) {
            command.execute();
        }
    }
}

你看到Client和Invoker彼此不认识(即他们没有关系)但仍然使用他们都知道的命令一起工作。