(12)观察者模式

2017-07-26  本文已影响3人  minminaya

定义

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。其实就是订阅模式。


使用场景

UML图

观察者模式UML图

优点

缺点


例子

DevTechFrontier是一个技术网站,当上面的内容更新时,系统会发邮件给订阅了该网站更新的程序员

  1. 被观察者角色,内容更新时,所有的观察者(程序员)都会收到相应的通知
import java.util.Observable;

/**
 * DevTechFrontier这个网站是被观察者角色,当它的内容更新时,所有的观察者(程序员)都会收到相应的通知
 * Created by Niwa on 2017/7/26.
 */
public class DevTechFrontierObservable extends Observable {

    public void postNewPublication(String content) {
        setChanged();
        notifyObservers(content);
    }


}
  1. 程序员类,观察者,在update()里处理被观察者更新时发出来的内容

import java.util.Observable;
import java.util.Observer;

/**
 * 具体观察者实现类
 * 程序员是观察者
 * Created by Niwa on 2017/7/26.
 */
public class Coder implements Observer {
    private String name;

    public Coder(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Hi," + name + ",DevTechFrontier:" + arg);
    }

    @Override
    public String toString() {
        return "程序员名字:" + name;
    }
}
  1. 测试类,注册被观察者和观察者,发布订阅信息,
/** 客户端类
 * Created by Niwa on 2017/7/26.
 */
public class Client {

    public static void main(String[] arg) {
        //被观察者
        DevTechFrontierObservable devTechFrontier = new DevTechFrontierObservable();

        //观察者
        Coder coder1 = new Coder("minminaya");
        Coder coder2 = new Coder("孙悟空");

        //注册观察者到可观察对象的观察者列表中(订阅)
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);

        //发布消息
        devTechFrontier.postNewPublication("我们网站有新的技术分享");
    }
}

结果:

Hi,孙悟空,DevTechFrontier:我们网站有新的技术分享
Hi,minminaya,DevTechFrontier:我们网站有新的技术分享


源代码:DesignPattern


参考

《Android源码设计模式解析与实战读书》
各大佬博客


end

上一篇 下一篇

猜你喜欢

热点阅读