2013-05-13 2 views
4

observer.update();Java Observer Отслеживание шаблонов?

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

Моих все действия наблюдатели и зарегистрировать их в сам себе конструктор, как показано ниже,

public class ParentAction extends AbstractAction implements IActionObserver{ 
    private ArrayList<IAction> lSubItems; 
    private View subView; 

    public ParentAction(String ItemText,int drawable,ArrayList<IAction> SubItems) { 
     super(ItemText,drawable);  
     lSubItems = SubItems; 
     ActionHolder.getInstance().registerObserver(this); 
    } 

    @Override 
    public void update() { 
     getSubView().setVisibility(View.GONE); 
    } ... 

ActionHolder

public class ActionHolder implements IActionSubject { 
    private static ActionHolder uniqueActionHolder; 
    private ArrayList observers; 

    private ActionHolder() { 
     observers = new ArrayList(); 
    } 

    public static synchronized ActionHolder getInstance() { 
     if (uniqueActionHolder == null) { 
      uniqueActionHolder = new ActionHolder(); 
     } 
     return uniqueActionHolder; 
    } 

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

    public void removeObserver(IActionObserver o) { 
     int i = observers.indexOf(o); 
     if (i >= 0) { 
      observers.remove(i); 
     } 

    } 

    public void notifyObserver() { 
     for (int i = 0; i < observers.size(); i++) {    
      IActionObserver observer = (IActionObserver) observers.get(i);   
      observer.update(); 
     } 
    } 

    public void actionClicked(View view) { 
     notifyObserver(); 
    } 

} 

ответ

3

Является ли это ваша собственная реализация шаблона наблюдателя? Если да, то вы можете изменить метод notify, например:

public void notifyObserver(IAction sender) { 
    for (int i = 0; i < observers.size(); i++) {    
     IActionObserver observer = (IActionObserver) observers.get(i); 
     if (observer != sender) 
      observer.update(); 
    } 
} 

и называть это как

ActionHolder.getInstance().notifyObserver(this); 

Альтернативно, можно добавить флаг в классе действий:

private bool sender = false; 

флаг перед уведомлением:

sender = true; 
ActionHolder.getInstance().notifyObserver(); 

и использовать этот флаг в update:

@Override 
public void update() { 
    if (!sender) { 
     getSubView().setVisibility(View.GONE); 
    } 
    sender = false; 
} 
+0

Спасибо, что помогли мне найти путь, я имеют интерфейс IAction, который реализуется abstractAction. Так notifyObserver (действие IAction) ... работал для меня, снова спасибо – Talha

+0

@talhakosen ok, не был уверен в точной иерархии, поэтому я изменил с 'IAction' на' AbstractAction', но я изменил его сейчас :) и yw –

+0

да, я просто хочу дать больше информации для другого разработчика, которому понадобится этот ответ :) Еще раз спасибо .. – Talha

1

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

Если я получил код правильно, вы можете добиться того, что, контролируя отправителя с view

public void actionClicked(View view) { 
    notifyObserver(view); 
} 

public void notifyObserver(View view) { 
    for (int i = 0; i < observers.size(); i++) {    
     IActionObserver observer = (IActionObserver) observers.get(i);   
     observer.update(view); 
    } 
} 

И update метод пропускает текущий вид

@Override 
public void update(View view) { 
    if (!getSubView().equals(view)) { 
     getSubView().setVisibility(View.GONE); 
    } 
} 
+0

Спасибо, что это тоже альтернатива +1 – Talha

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