Java Observer模式查找发件人?

时间:2013-05-13 13:38:20

标签: java design-patterns observer-pattern

observer.update();

上面的方法使观察者的可见性为“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();
    }

}

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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);
   }
}