Модель поделена между двумя объектами - PullRequest
2 голосов
/ 27 апреля 2009

У меня есть три класса, взаимодействующих интересным образом. Один - это модельный класс, и к нему должны обращаться оба других класса, поэтому один его экземпляр сохраняется как член каждого из них. Оба эти класса взаимодействуют с моделью по-разному.

Есть пара случаев, когда объект модели должен быть полностью отброшен и заменен новым, и это усложняет ситуацию. И эти случаи возникают в обоих классах просмотра / контроля. Таким образом, любой из этих классов должен иметь возможность отправлять сигнал другому, говоря: «Нам нужно координировать и облегчать замену нашего объекта Model новым объектом Model». Прямо сейчас у меня есть код в классе B, чтобы сказать классу A построить новую модель и отправить ее обратно, но теперь мне нужно разобраться с противоположной ситуацией, когда событие возникает в классе A, и, к сожалению, класс A не имеет ссылки на класс B и, вероятно, не должен.

Какой хороший способ справиться с этим?

Обновление : Извините, ребята, это не может быть одиночкой. Синглтоны - это когда вам нужно гарантировать, что есть только один предмет. Это не имеет ничего общего ни с одним из требований, которые я изложил выше. Этот класс не одиночный и не должен быть.

Обновление : До сих пор на самом деле был только один экземпляр этого класса Model, но у меня было смутное подозрение, что мне нужно было учесть больше, и я не хотел ограничивать себя использование шаблона проектирования Singleton, когда это фактически решает проблемы, отличные от того, что у меня есть Оказывается, я был прав: вчера я получил новое требование, и теперь мне нужно поддержать произвольное число из них. :) Не ограничивайте себя, когда это не нужно, и не используйте шаблоны проектирования в ситуациях, когда они не были предназначены!

Ответы [ 3 ]

5 голосов
/ 27 апреля 2009

Вам понадобится промежуточный слой модели, объект-держатель модели, на который ссылается каждый из двух классов. ModelHolder содержит ссылку на модель.

Этот ModelHolder также должен поддерживать слушателей, поэтому, когда его модель выбрасывается, он может уведомить любых слушателей, что модель изменилась.

1 голос
/ 27 апреля 2009

Хорошо, если вам нужно изменить модель (но не принудительно), вы можете создать интерфейс слушателя и заставить оба объекта A и B реализовать его:

public interface ModelListener {

    public void modelChanged(Model newModel);
}

и в нужное время вы можете уведомить слушателей о смене новой модели. У вас также может быть список, содержащий всех зарегистрированных слушателей.

List<ModelListener> modelListeners = new ArrayList<ModelListener>();

    public void setNewModel(Model m) {
        for (ModelListener aListener : m.modelListeners)
            aListener.modelChanged(m);
    }

Как всегда, есть компромиссы между простотой и надежностью. Возможно, вы захотите поэкспериментировать с уровнями, необходимыми для вашего собственного случая.

0 голосов
/ 27 апреля 2009

Я часто сталкиваюсь с этой проблемой проектирования в проектах с графическим интерфейсом (Swing, GWT). Обычно я создаю модель «State» более высокого уровня, которая содержит экземпляр объекта, который используется совместно двумя или более классами. Затем State имеет интерфейс ModelListener, который другие классы могут реализовать для получения уведомлений об изменениях в базовой модели. Затем State.setFoo () запускает события ModelChanged для слушателей, которые отвечают соответствующим образом.

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