码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2016-07-31 00:24:13      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

观察者模式:

        观察者模式定义了一种一对多的依赖关系,当一个对象改变状态时,它的所有依赖者都会受到通知,并自动更新。

注意: 观察者模式会造成内存泄漏,一定要记得取消订阅

技术分享

UML关系图如下:

技术分享
UML

观察者模式提供了一种对象设计,让主题和观察者之间松耦合。

  1. 观察者与主题之间依赖于接口,主题不需要知道观察者的具体实现
  2. 可以动态添加删除观察者,对主题没有任何影响
  3. 新增新类型的观察者对主题没有影响,主题的代码不需要修改,而且旧的观察者也不受影响
  4. 观察者与主题都可以独立复用,因为是松耦合
  5. 只要约定的接口不改变,修改主题或观察者任何一方,都不会影响另一方

代码实现

首先定义抽象的观察者:

public interface Watcher {
	void update(String str);
}
定义被观察者:

public interface Watched{
    void addWatcher(Watcher watcher);
    void removeWatcher(Watcher watcher);
    void notifyWatchers(String str);
}

定义具体的观察者

public class ConcreteWatcher implements Watcher{
    @Override
    public void update(String str){
        System.out.println(str);
    }
}
定义具体的被观察者:

import java.util.ArrayList;
import java.util.List;
public class ConcreteWatched implements Watched{
    // 存放观察者
    private List<Watcher> list = new ArrayList<Watcher>();
    @Override
    public void addWatcher(Watcher watcher){
        list.add(watcher);
    }
    @Override
    public void removeWatcher(Watcher watcher) {
        list.remove(watcher);
    }
    @Override
    public void notifyWatchers(String str){
        // 自动调用实际上是主题进行调用的
        for (Watcher watcher : list){
            watcher.update(str);
        }
    }
}
书写测试类:

public class Test{
    public static void main(String[] args){
        Watched girl = new ConcreteWatched();

        Watcher watcher1 = new ConcreteWatcher();
        Watcher watcher2 = new ConcreteWatcher();
        Watcher watcher3 = new ConcreteWatcher();
        
        girl.addWatcher(watcher1);
        girl.addWatcher(watcher2);
        girl.addWatcher(watcher3);
        
        girl.notifyWatchers("开心");
    }
}
其实,如果大家做过Android开发的话,Android里面大量用了观察者模式,用textWatcher,eventbus等。




观察者模式

标签:

原文地址:http://blog.csdn.net/xiangzhihong8/article/details/52075547

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!