2012-11-05 2 views
2

Код ниже был взят из другого сообщения SO, мне было интересно, есть ли лучший способ написать этот код, потому что его вид уродливый, чтобы иметь цикл, который уведомляет всех слушателей в конце каждого реализованного метода. Если это глупо простить меня, я новичок в Java.Шаблон наблюдателя в java, лучший способ?

Примечание: Я буду реализовывать несколько методов в интерфейсе, у меня будет реализовано 5 методов.

  import java.util.*; 

      interface HelloListener { 
       public void someoneSaidHello(); 
      } 


      class Initiater { 
       List<HelloListener> listeners = new ArrayList<HelloListener>(); 

       public void addListener(HelloListener toAdd) { 
        listeners.add(toAdd); 
       } 

       public void sayHello() { 
        System.out.println("Hello!!"); 

        // Notify everybody that may be interested. 
        for (HelloListener hl : listeners) 
         hl.someoneSaidHello(); 
       } 
      } 


      class Responder implements HelloListener { 
       @Override 
       public void someoneSaidHello() { 
        System.out.println("Hello there..."); 
       } 
      } 
+2

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

ответ

2

Когда я реализовал шаблон наблюдателя в качестве студента, я сделал это как аннотация класс:

import java.util.ArrayList; 

/** 
* The observer pattern. 
* @author jiman 
*/ 
public abstract class Observed { 

    private ArrayList<Observer> observers; 

    public Observed() { views = new ArrayList<Observer>(); } 

    public void registerObserver(Observer o) { observers.add(o); } 

    public void removeObserver(Observer o) { observers.remove(o); } 

    // call this method upon a mutation of the state of this object 
    public void notifyObservers() { for (Observer o : observers) o.update(); } 

} 

Наблюдатели унаследуют этот интерфейс и создают собственные методы обновления.

public interface Observer { 

    public void update(); 

} 
+0

Обоснование за наблюдаемым абстрактным, а не интерфейсом: абстрактные классы могут реализовывать методы и содержать переменные. Таким образом, вам не нужно повторно выполнять этот код каждый раз в своих дочерних классах;) – Jiman

+0

Я узнал после того, как это почти так, как это делает Java. – Jiman

1

В JDK существуют два класса, которые помогут вам в этом.

Observer (интерфейс) и Observable (класс)

Небольшой пример о том, как использовать их:

class MyView implements Observer { 

    public void update(Observable obs, Object x) { 
     System.out.println("update(" + obs + "," + x + ");"); 
    } 
    } 

    /** The Observable normally maintains the data */ 
    class MyModel extends Observable { 

    public void changeSomething() { 
     // Notify observers of change 
     setChanged(); // THIS IS IMPORTANT DON'T FORGET IT! 
     notifyObservers(); 
    } 
    } 
+0

Не могли бы вы показать некоторый код в отношении примера с помощью нескольких методов интерфейса? –

+0

И многие считают, что они не все так хорошо, тем более что Observable - это класс, а не интерфейс, и он заставляет все, что вы наблюдаете, чтобы расширить этот класс. Сам я обычно использую PropertyChangeSupport с PropertyChangeListeners для прослушивания изменений состояния класса. –

+0

Код был в пути ... – Frank

2

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

Например, исходный код для javax.swing.AbstractButton имеет метод firestateChanged() для уведомления слушателей об изменении состояния и т.д.

+0

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

+0

Вы * * Патриция Шанахан из [Итак, вам нужно написать программу, но не знаете, как начать] (http://home.earthlink.net/~patricia_shanahan/beginner.html) слава? Если это так, ты мой герой !!! Серьезно, я рекомендовал эту статью бесчисленным потерянным душам, и это помогло немало. Спасибо вам за это! –

+0

Да, это я. Я рад, что это полезно. –

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