您当前的位置: 首页 > 

xiangzhihong8

暂无认证

  • 0浏览

    0关注

    1324博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

观察者模式

xiangzhihong8 发布时间:2016-07-30 22:40:43 ,浏览量: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 list = new ArrayList();
    @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等。

关注
打赏
1482932726
查看更多评论
立即登录/注册

微信扫码登录

0.1185s