2012-03-31 3 views
4

Я хочу создать событие, генерирующее/потребляющее для системы, В различных ситуациях могут возникать различные типы событий. Я нашел, что мне нужно написать код генерации событий везде, а код генерации событий тесно связан с бизнес-логикой.Лучшая практика для создания событий?

Например, для случая изменения объекта я написал код во всех методах, которые меняют этот объект, и методах, которые изменяют объект во многих местах в проекте.

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

Я считаю, что у вас, ребята, есть опыт в решении проблем и реализация слабосвязанной и простой в обслуживании системы. Есть ли у вас предложения?

Моего языка реализации является Java, но я думаю, что эта проблема справедлива для любого языка, если какие-либо конкретные решения Java также приветствуется :)

Спасибо!

ответ

8

Возможно, вам стоит взглянуть на механизм google guava EventBus. Это хороший и простой способ отделить большую часть обработчика события, регистрирующего шаблон с ваших объектов.

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

3

Вы можете рассмотреть, начиная со стандартной EventListener подход, который широко используется в классах Java:

public interface ChangeListener extends java.util.EventListener { 
    public void beforeChange(Object subject); 
    public void afterChange(Object subject); 
} 

public class EventedObject { 
    private List<ChangeListener> changeListeners = new ArrayList<>(); 

    public void addChangeListener(ChangeListener changeListener) { 
    changeListeners.add(changeListener); 
    } 

    protected void fireBeforeChange() { 
    for(ChangeListener listener : changeListeners) listener.beforeChange(this); 
    } 

    protected void fireAfterChange() { 
    for(ChangeListener listener : changeListeners) listener.afterChange(this); 
    } 
} 

public class MyObject extends EventedObject { 
    // 
    // 
    public void doSomething() { 
    fireBeforeChange(); 
    // do 
    fireAfterChange(); 
    } 
} 


public class ChangeService { 

    public void init() { 
    MyObject myObject = new MyObject(); 

    myObject.addChangeListener(new ChangeListener() { 
     public void beforeChange(Object subject) { 
     System.out.println("Before changing " + subject); 
     } 

     public void afterChange(Object subject) { 
     System.out.println("After changing " + subject); 
     } 
    }); 

    changeObject(myObject); 
    } 

    private void changeObject(MyObject object) { 
    object.doSomething(); 
    } 
} 

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

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