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

不想进行文字叙述,相关叙述网上或者书上很多,可以自行查阅学习。本文只是贴一些代码,代码是最好的文字。需要说明的是,本文只是说明怎么使用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。








你可能感兴趣的:(设计模式之观察者模式(Obsever)2)