观察者模式

来源:互联网 发布:删除淘宝中差评的公司 编辑:程序博客网 时间:2024/06/03 18:52

作用:

多个观察者对象同时监听某一个主题对象。主题对象状态上改变,就会通知所有的观察者。

    事物之间的通信。有些事件可以通过广播的形式,但会出现突发情况。

原理:主题对象的数据在被修改的时候,会及时通知所有被观察者。


主题(被观察者,需要看他更新,某些操作时发出通知):

    1.添加新的观察者,可能需要做不同的操作,给别的地方使用

    2.删除观察者

    3.通知所有观察者

public interface Subject{     void addObserver(Observer o);     void removeObserver(Observer o);     void notifyObservers();}
  具体实现。

public class Button implements Subject {// 所有观察者的集合private ArrayList<Observer> observers = null;public Button() {observers = new ArrayList<Observer>();}@Overridepublic void addObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}/** * 通知所有观察者 */@Overridepublic void notifyObservers() {for (Observer o : observers) {     o.update();}}/** * 按钮点击事件 */public void click() {notifyObservers();}}

观察者:

有一个接口方法,来接受主题改变的通知

public interface Observer {void update();}
观察者,接收到通知,后作出相应的相应

public class DisplayObserver implements Observer {@Overridepublic void update() {System.out.println("按钮被点击!我输出!");}}

执行:

public class Main {public static void main(String[] args) {Button button = new Button();DisplayObserver display = new DisplayObserver();button.addObserver(display);button.click();}}


JAVA对观察者模式,是有内置支持的。

Observable类,创建能观测到你的程序中其他部分的子类。(主题对象)当这些子类发生变化时,观察者被通知。

这个类是父类,你需要继承这个类。里面的数组不是arrayList,是Vector,说明是线程安全的。

并且对addObserver,deleteObserver 加锁synchronized。

继承之后,子类的方法中可以加,setChange()标志,已经改变,然后notifyObservers()或者notifyObserver(Object),通知全部(可传参数)

public class JAVAObservable extends Observable {public void count() {for (int i = 0; i < 20; i++) {setChanged();notifyObservers(i);}}}

观察者,必须实现Observer接口,实现update方法。

public class JAVAObserver implements Observer {@Overridepublic void update(Observable o, Object arg) {System.out.println(o.countObservers());System.out.println("参数:" + arg);}}
main

public static void main(String[] args) {JAVAObservable javaObservable = new JAVAObservable();JAVAObserver observer = new JAVAObserver();javaObservable.addObserver(observer);javaObservable.count();}
输出结果:





0 0
原创粉丝点击