设计模式之观察者模式(Obsever)2

来源:互联网 发布:供给侧改革成效数据 编辑:程序博客网 时间:2024/04/28 08:45

不想进行文字叙述,相关叙述网上或者书上很多,可以自行查阅学习。本文只是贴一些代码,代码是最好的文字。需要说明的是,本文只是说明怎么使用JAVA提供的观察者模式。

1、最简单最好理解的使用

被观察者(主题角色)

package com.sailang.observerpattern;import java.util.Observable;public class Watched extends Observable {        public void notify(String str) {        setChanged();        notifyObservers(str);    }    }
观察者

package com.sailang.observerpattern;import java.util.Observable;import java.util.Observer;public class Watcher implements Observer{    @Override    public void update(Observable o, Object arg) {        System.out.println("Watcher, arg = " + arg.toString());    }}
客户端

package com.sailang.observerpattern;public class TestClass {    public static void main(String[] args) {        Watched watched = new Watched();        watched.addObserver(new Watcher());        watched.notify("勤奋是最好的品质!");    }}

2、观察者模式和单例模式的结合

package com.sailang.observerpattern;import java.util.Observable;public class Watched extends Observable {    private static Watched mInstance;    public static synchronized Watched getInstance() {        if (mInstance == null) {            mInstance = new Watched();        }        return mInstance;    }    public void notify(String str) {        setChanged();        notifyObservers(str);    }}
这样做,可以保证是同一个被观察者,而且,可以在复杂的环境中也可以很容易的获得这个被观察者实例。

package com.sailang.observerpattern;import java.util.Observable;import java.util.Observer;public class Watcher implements Observer {    public Watcher() {        Watched.getInstance().addObserver(this);    }    @Override    public void update(Observable o, Object arg) {        System.out.println("Watcher, arg = " + arg.toString());    }}
在生成观察者实例时,就和被观察者发生关系,这是一种实用的编程技巧。

package com.sailang.observerpattern;public class TestClass {    public static void main(String[] args) {        new Watcher();        new Watcher();        new Watcher();        Watched.getInstance().notify("勤奋是最好的品质!");    }}
这样写代码,是不是看的简洁又巧妙!呵呵


观察者模式是一种经常用到的一种设计模式,采用这种设计模式可以实现两个类之间的通信,我们可以这样理解,采用观察者模式,我们让TestClass和Watcher这两个对象进行了通信。


20140115(补充)

虽然采用第二种方式,在实现需求方面有很大的灵活性,但是,我们注意到mIstance是属于Water类的,也就是说Water类存在mIstance实例就一直存在。这样就会出现一个问题,mIstance addObserver进去的Observer对象就一直存在,得不到释放,一直在内存中,这是我们不愿看到的,所以我们有时需要deleteObserver。








0 0
原创粉丝点击