Вопрос о шаблоне команд; требуется уточнение; Джава - PullRequest
3 голосов
/ 29 января 2011

Предположим, у вас есть следующая команда:

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 ]

1 голос
/ 29 января 2011

Если вы сделаете метод publishLastFive() защищенным, доступ к этому методу могут получить только объекты из одного пакета.(Предполагая, что ваш класс PublishLastFiveCommand находится в том же пакете, он может без проблем вызвать этот метод, но клиентский код в других пакетах не может напрямую вызвать publishLastFive().

.new PublishLastFiveCommand(p).execute();. Почему вы хотите предотвратить это?

0 голосов
/ 29 января 2011

Хорошо, ребята, я понял.

Публикация на случай, если у других возникнет такой же вопрос.

В команде:

@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();
0 голосов
/ 29 января 2011

AFAIK совсем нет, потому что execute () является публичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...