命令模式问题;需要澄清; Java的

时间:2011-01-29 17:16:53

标签: java command design-patterns

假设您有如下命令:

public class PublishLastFiveCommand implements Command {
    private Producer p;

    public PublishLastFiveCommand(Producer p) {
    this.p = p;
    }

    public void execute() {\    
    p.publishLastFive();
    }
}

另外,制作人允许你

public void publishLastFive() {
    System.out.println("publishing last 5");
}

Command c;

public void setCommand(Command c) {
    this.c = c;
}

public void execute() {
    c.execute();
}

问题:

预期用途是:

Command publish5 = new PublishLastFiveCommand(p);
p.setCommand(publish5);
p.execute();

我是否有一种优雅的方式来防范:

p.publishLastFive()

直接打电话?

3 个答案:

答案 0 :(得分:1)

如果使publishLastFive()方法受到保护,则只有同一包中的对象才能访问该方法。 (假设您的PublishLastFiveCommand类在同一个包中,它可以毫无问题地调用该方法,但其他包中的客户端代码不能直接调用publishLastFive()

我不明白你对阻止new PublishLastFiveCommand(p).execute();的意思。你为什么要阻止这个?

答案 1 :(得分:0)

AFAIK完全没有,因为execute()是公开的。

答案 2 :(得分:0)

好的伙计们,我明白了。

发布以防万一,其他人也可能有同样的问题。

按命令:

@Override
public void execute() {
    p.setCommand(this);      <-- add this line
    p.publishLastFive();
}

关于制片人

public void publishLastFive() {
    if (c != null) {         <--- add null check
        System.out.println("publishing last 5");
    } 
}

Command c = null;

public void setCommand(Command c) {
    this.c = c;
}

public void execute() {
    c.execute();
    c = null;                <-- once done executing, set command to null
}

广告结果:

工作的:

publish5.execute();

工作的:

p.setCommand(publish5);
p.execute();

根据需要不起作用

p.publishLastFive();