【问题标题】:Java Observer Pattern finding sender?Java观察者模式寻找发件人?
【发布时间】:2013-05-13 13:38:19
【问题描述】:

observer.update();

上述方法使观察者的可见性“消失”,但我想更改除发送者观察者之外的所有其他观察者。我该如何控制?

我的所有动作都是观察者,并在他们的构造函数中注册,如下所示,

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();
    }

}

【问题讨论】:

    标签: java design-patterns observer-pattern


    【解决方案1】:

    这是你自己实现的观察者模式吗?如果是这样,你可以修改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;
    }
    

    【讨论】:

    • 感谢它帮助我找到方法,我有 IAction 接口,它是由 abstractAction 实现的。所以 notifyObserver(IAction action) ... 为我工作,再次感谢
    • @talhakosen 好的,不确定确切的层次结构,所以我从IAction 更改为AbstractAction,但我现在又改回来了:) 和yw
    • 是的,我只是想为需要此答案的其他开发人员提供更多信息:) 再次感谢..
    【解决方案2】:

    您在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);
       }
    }
    

    【讨论】:

    • 谢谢,这也是+1的替代方案
    猜你喜欢
    • 2014-02-06
    • 2021-04-04
    • 2016-02-20
    • 2023-04-10
    • 2012-02-15
    • 2012-12-29
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多