观察者模式

    xiaoxiao2026-02-25  8

    观察者模式:

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

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

    UML关系图如下:

    UML

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

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

    代码实现

    首先定义抽象的观察者:

    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等。 相关资源:javascript的oop思想以及单例,工厂,观察者模式简例
    最新回复(0)