设计模式学习笔记—观察者模式

来源:互联网 发布:php上传图片前压缩 编辑:程序博客网 时间:2024/05/08 15:58

观察者模式(Observer Pattern)

观察者模式的目标大概是这样

当某个方法执行时去执行一系列的方法

不知道为什么,每当我看到这个模式时就想到按钮点击

public interface OnClickListener {    void onClick(Button view);}
public class Button {    private Set<OnClickListener> mClickListeners = new HashSet<OnClickListener>();    private String mText;    public Button(String text) {        mText = text;    }    public void addOnClickListener(OnClickListener listener) {        mClickListeners.add(listener);    }    public void click() {        for (OnClickListener listener : mClickListeners) {            listener.onClick(this);        }    }    public String getText() {        return mText;    }}

调用的时候是这样

        Button btn = new Button("btn1");        btn.addOnClickListener(new OnClickListener() {            @Override            public void onClick(Button view) {                System.out.println(view.getText());            }        });        // 这个方法一般不会在这里调用        btn.click();

这样的话看起来很眼熟了,但…观察者呢?所以,要改名字。

// 这个是原来的 Button,是被观察的对象public class Subject {    private Set<Observer> mObservers = new HashSet<Observer>();    private String mText;    public Subject(String text) {        mText = text;    }    public void registerObserver(Observer observer ) {        mObservers.add(observer);    }    public void notifyObservers() {        for (Observer observer : mObservers) {            observer.notify(this);        }    }    public String getText() {        return mText;    }}
// 原来的 onclicklistener 是观察者public interface Observer {    void notify(Subject view);}

调用的时候并没有该多少

        Subject btn = new Subject("btn1");        btn.registerObserver(new Observer() {            @Override            public void notify(Subject view) {                System.out.println(view.getText());            }        });        // 这个方法一般不会在这里调用        btn.notifyObservers();

这么一改就变得不那么眼熟了 - -
这个设计模式麻烦的地方应该在于通知的时机,反正是不可能刚添加完事件就去调用的,其它的使用方式,就像刚开始说的那样,适合于需要注册或者订阅,在某种条件下去调用观察者的某个方法。

The end.

0 0