2012-06-25 8 views
2

У меня есть специализированный класс объектов, который отправляет сообщения своим компонентам, чтобы они могли поменять себя по мере необходимости. Класс объекта позволяет мне смешивать и сопоставлять компоненты, чтобы я мог иметь разные объекты с одинаковой функциональностью, не имея большого дерева наследования. (Я думаю, что это называется компонентом шаблон.) Вот что я хочу сделать:Как реализовать систему отправки сообщений?

//MyObject.java 
public class MyObject { 

    private HashSet<MyComponent> components_; 

    void send(Message message) { 
     for (MyComponent component : components_) { 
      component.receive(message); 
     } 
    } 

    // other unrelated methods and variables... 

} 

// MyComponent.java 
public interface MyComponent { 

    public void receive(Message message); 

    // other unrelated methods... 

} 

// RendererComponent.java 
public class RendererComponent implements MyComponent { 

    public void receive(Message message) { 
     if (message.getType() == Message.Type.POSITION_CHANGED) { 
      Point positionDifference = message.getInfo(); 
      redraw(positionDifference); 
     } else if (message.getType() == Message.Type.SCORE_CHANGED) { 
      Integer score = message.getInfo(); 
      redraw(score); 
     } // else if... 
    } 

    private void redraw(Point positionDifference) { 
     // draws item at new position... 
    } 

    private void redraw(Integer score) { 
     // draws the new score... 
    } 

    // other unrelated methods and variables.. 
} 

У меня есть много компонентов, и они получают множество различных типов сообщений. Как написать свой класс Message, чтобы я мог получать от него информацию о разных типах классов? Нужно ли мне изменить способ обработки сообщений моим классом?

+0

Я не совсем понимаю, что вы подразумеваете под «Как написать свой класс сообщений, чтобы я мог получать от него информацию о разных типах классов?». Может быть, вы могли бы привести пример проблемы, которую вы пытаетесь решить? –

+0

@AlexLynch Я хочу, чтобы мой метод getInfo() в моем классе Message возвращал разные данные с разными типами классов (как показано в моем примере RendererComponent), чтобы информация могла обрабатываться по-разному. – Eva

+0

Я не предполагаю, что ваш getInfo() может просто вернуть объект? До тех пор, пока вы используете getType() для подтверждения типа объекта, который вы получаете, я не предвижу никаких проблем с безопасностью типа - или он будет обескуражен, независимо от того, что он не является очень безопасным для типа? –

ответ

1

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

Обычный (и простой) способ сделать это с помощью механизмов публикации внутренних событий Java. Вы определяете класс, представляющий событие, и интерфейс, который должны выполнять исполнители/потребители событий с помощью метода обратного вызова, произошедшего с событием. У производителя событий есть метод регистрации для регистрации потребителя события и ведет список зарегистрированных потребителей. Когда производитель хочет отправить событие, он создает объект события, а затем вызывает обратный вызов «событие произошел» для всех зарегистрированных пользователей.

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


Хорошее место для начала изучения событий в свинг Учебник Introduction to Event Listeners.

+0

Я подумал об этом, но я смутился о том, могу ли я добавить слушателя событий в класс, который не запускает событие. Можете ли вы дать краткий пример того, как реализовать его с помощью событий? – Eva

+0

Также как я могу убедиться, что только компоненты одного и того же объекта получили события, отправленные другим компонентом этого объекта? – Eva

+0

@Eva - 1) Я добавил ссылку на соответствующую часть учебника Swing. 2) Вы бы договорились, что каждый объект компонента зарегистрировал прослушиватель событий с объектом-контейнером. Если вам нужен один компонент для отправки событий другим компонентам, контейнер должен будет выставить метод для этого. –

Смежные вопросы