编程语言
首页 > 编程语言> > Java Observer模式查找发件人?

Java Observer模式查找发件人?

作者:互联网

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

}

解决方法:

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

并在更新中使用此标志:

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

标签:java,design-patterns,observer-pattern
来源: https://codeday.me/bug/20190625/1284373.html