观察者模式

时间:2022-04-26
本文章向大家介绍观察者模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

观察者模式:

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

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

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等。