关键点:

    1、针对观察者与被观察者分别定义接口,有利于分别进行扩展。

    2、重点就在被观察者的实现中:

      (1)定义观察者集合,并定义针对集合的添加、删除操作,用于增加、删除订阅者(观察者)

      (2)定义通知方法,用于将新情况通知给观察者用户(订阅者用户)

    3、观察者中需要有个接收被观察者通知的方法。

1.抽象主题角色,watched被观察

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

2.抽象观察角色


public interface Watcher {
    public void update(String str);
}

3.具体的被观察者

public class ConcreteWatched implements Watched {
    //1.需要存储观察者
    private List<Watcher> list = new ArrayList<Watcher>();
    //2.新增观察者
    public void addWatcher(Watcher watcher) {
        list.add(watcher);

    }
    //3.删除观察者
    public void removeWatcher(Watcher watcher) {
        list.remove(watcher);

    }
    //4.调用观察者的方法来通知观察者
    public void notifyWatchers(String str) {
        for(Watcher watcher:list){
            watcher.update(str);
        }

    }
}

4.具体的观察者

public class ConcreteWatcher implements Watcher {
    public void update(String str) {
        System.out.println(str);
    }
}

5.测试客户端

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("update");
    }


}

本问的实现较为简单,比较通用的实现方式为观察者和被观察者都有多个实现,

可参考下面这篇博文

https://www.cnblogs.com/V1haoge/p/6513651.html