b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

解释器模式举例_lua解释器交互模式_动态编译与解释器模式(26)

电脑杂谈  发布时间:2017-02-22 17:29:35  来源:网络整理

好,现在就可以直接使用了:

public class TestUse {    public static void main(String args[]){        //创建主题        WeatherService service = WeatherService.instance;        //添加观察者        service.addClient(new ClientAndroidServer());        service.addClient(new ClientIphoneServer());        //更新主题        service.updateWeather(new WeatherInfo(System.currentTimeMillis(), "多云"));        service.updateWeather(new WeatherInfo(System.currentTimeMillis()1000*60*60*24, "多云转晴"));        service.updateWeather(new WeatherInfo(System.currentTimeMillis()1000*60*60*24*2, "晴"));    }}

运行后,控制台有如下输出:

安卓服务收到最新天气:time=1461246047007msg=多云。马上开始推送消息...苹果服务收到最新天气:time=1461246047007msg=多云。马上开始推送消息...安卓服务收到最新天气:time=1461332447007msg=多云转晴。马上开始推送消息...苹果服务收到最新天气:time=1461332447007msg=多云转晴。马上开始推送消息...安卓服务收到最新天气:time=1461418847007msg=晴。马上开始推送消息...苹果服务收到最新天气:time=1461418847007msg=晴。马上开始推送消息...

可以看出,观察者模式是一对多的。而本例是将更新的内容整个推给客户端。

而观察者模式中的数据有推和拉的区别,上例是推。

推的方式会将主题更改的内容全部直接推给客户端,拉的方式就是主题的数据更新后,不直接将数据推给客户端,而是先推送一个通知并提供对应的方法供客户端拉取数据。

如果上例中,天气服务每半小时更新(半点和整点推消息),还有一个客户端,不需要特别即时的天气消息,只取整点的消息,那么我们就可以使用拉的方式,数据更新后,给客户端推送一个标志,客户端自己按需取得数据(天气服务需要提供这样一个接口)。这就是拉。

java.util包中也提供了观察者模式的支持,因为java程序设计中使用比较广泛。有一个Observable类(相当于这里的具体主题)和一个Observer接口(相当于这里的主题接口):

public intece Observer {    void update(Observable o, Object arg);}
public class Observable {    private boolean changed = false;    private Vector<Observer> obs;    public Observable() { obs = new Vector<>();}    public synchronized void addObserver(Observer o) {        if (o == null) throw new NullPointerException();        if (!obs.contains(o)) { obs.addElement(o); }    }    public synchronized void deleteObserver(Observer o) { obs.removeElement(o); }    public void notifyObservers() { notifyObservers(null); }    public void notifyObservers(Object arg) {        Object[] arrLocal;        synchronized (this) {            if (!changed) return;            arrLocal = obs.toArray();            clearChanged();        }        for (int i = arrLocal.length-1; i>=0; i--) ((Observer)arrLocal[i]).update(this, arg);    }    public synchronized void deleteObservers() { obs.removeAllElements(); }    protected synchronized void setChanged() { changed = true; }    protected synchronized void clearChanged() { changed = false; }    public synchronized boolean hasChanged() { return changed; }    public synchronized int countObservers() { return obs.size(); }}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-26.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 薛道衡
      薛道衡

      美国扰乱了伊拉克

    • 洛克恩斯托拉托斯
      洛克恩斯托拉托斯

      上高中学文的

    热点图片
    拼命载入中...