前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >观察者模式

观察者模式

作者头像
xiangzhihong
发布2018-02-05 10:13:48
6570
发布2018-02-05 10:13:48
举报
文章被收录于专栏:向治洪向治洪

观察者模式:

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

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

UML关系图如下:

UML

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

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

代码实现

首先定义抽象的观察者:

代码语言:javascript
复制
public interface Watcher {
	void update(String str);
}

定义被观察者:

代码语言:javascript
复制
public interface Watched{
    void addWatcher(Watcher watcher);
    void removeWatcher(Watcher watcher);
    void notifyWatchers(String str);
}

定义具体的观察者

代码语言:javascript
复制
public class ConcreteWatcher implements Watcher{
    @Override
    public void update(String str){
        System.out.println(str);
    }
}

定义具体的被观察者:

代码语言:javascript
复制
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);
        }
    }
}

书写测试类:

代码语言:javascript
复制
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等。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-07-30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档