观察者模式(这个用的太多了)

来源:互联网 发布:安卓手机淘宝网 编辑:程序博客网 时间:2024/05/22 03:03

一.观察者模式的定义

定义对象间一种一对多的依赖关系,是的没当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

二.观察者模式的使用场景

(1).关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系

(2).事件多级触发场景

(3).跨系统的消息交换场景,如消息队列,事件总线的处理机制。

三.观察者模式的UML类图

角色介绍:

subject:抽象主题(Observer,也就是被观察observable的角色,抽象主题角色把所有观察者对象的引用保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加或删除观察者对象。

concreteSubject:具体主题(ConcreteObservable,该角色将有关状态存入具体观察对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知,具体主题角色又叫具体被观察这(ConcreteObservable)角色

observale:抽象观察者,该角色是观察者的抽象类,它定义了更新接口,使得在得到主题的更改通知时更新自己。

ConcreteObserver:具体的观察者,该角色实现抽象观察者角色所定义的更新接口,以便在主题的状态发生变化时更新自身的状态。

四.观察者模式的简单实现

/** * Created by Administrator on 2016/4/4 0004. * //观察者 */public interface Observer {    void update(String str);}


/** * Created by Administrator on 2016/4/4 0004. * //被观察者 */public interface Observable {    void addObserver(Observer obs);    void notifyAllChanges(String str);    void removeObserver(Observer obs);}


/** * Created by Administrator on 2016/4/4 0004. */public class ConcreteObserver implements  Observer {    private String name ;    public ConcreteObserver(String name) {        this.name = name;    }    @Override    public void update(String str) {        System.out.println(str+name);    }}


/** * Created by Administrator on 2016/4/4 0004. * //被观察者 */public class ConcreteObservable implements Observable {    // 存放观察者    private List<Observer> list = new ArrayList<Observer>();    @Override    public void addObserver(Observer obs) {        list.add(obs);    }    @Override    public void notifyAllChanges(String str) {        // 自动调用实际上是主题进行调用的        for (Observer watcher : list) {            watcher.update(str);        }    }    @Override    public void removeObserver(Observer obs) {        list.remove(obs);    }}


public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Observable girl = new ConcreteObservable(); //女神微信        Observer watcher1 = new ConcreteObserver("吊丝一号"); //关注女神的吊丝一        Observer watcher2 = new ConcreteObserver("吊丝二号"); //关注女神的吊丝二        Observer watcher3 = new ConcreteObserver("吊丝三号"); //关注女神的吊丝三        girl.addObserver(watcher1);        girl.addObserver(watcher2);        girl.addObserver(watcher3);        girl.notifyAllChanges("今天天晴"); //女神微信发布新动态//吊丝都看到了    }}


结果:

今天天晴吊丝一号
今天天晴吊丝二号
今天天晴吊丝三号


五:高级实践可以参考下另外一篇博客AndroidEventBus源码分析

http://blog.csdn.net/u011889786/article/details/51056215

0 0
原创粉丝点击