多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象的行为
    观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

    【角色】

    • 主题(Subject):被观察者,它是指被观察的对象。处理观察者的变化。当它的状态发生改变时,向它的各个观察者发出通知。
    • 具体主题(ConcreteSubject):是一个实现主题接口的类,有一个用来存放观察者对象的容器。
    • 观察者(Observer):根据主题中的更改而进行更新,观察者一般定义为接口,该接口声明了更新数据的方法 update(),因此又称为抽象观察者。
    • 具体观察者(ConcreteObserver):具体观察者的实现类。

    【优点】

    • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系,符合“开闭原则”的要求

    【缺点】

    • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
    • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

      1. /**
      2. * 观察者接口
      3. */
      4. public interface Observer {
      5. void update(String message);
      6. }
      1. /**
      2. * 观察者类
      3. */
      4. public class ConcreteObserver implements Observer {
      5. private String name;
      6. public ConcreteObserver(String name) {
      7. this.name = name;
      8. }
      9. @Override
      10. public void update(String message) {
      11. System.out.println(name + " 收到了动态:" + message);
      12. }
      13. }
      1. /**
      2. * 主题抽象类
      3. */
      4. public interface Subject {
      5. /**
      6. * 添加观察者
      7. * @param observer
      8. */
      9. void add(Observer observer);
      10. /**
      11. * 移除观察者
      12. * @param observer
      13. */
      14. void remove(Observer observer);
      15. /**
      16. * 通知所有观察者
      17. * @param message
      18. */
      19. void notify(String message);
      20. }
      1. /**
      2. * 主题类
      3. */
      4. public class ConcreteSubject implements Subject {
      5. private List<Observer> observerList = new ArrayList<>();
      6. /**
      7. * 添加观察者
      8. * @param observer
      9. */
      10. @Override
      11. public void add(Observer observer) {
      12. observerList.add(observer);
      13. }
      14. /**
      15. * 移除观察者
      16. * @param observer
      17. */
      18. @Override
      19. public void remove(Observer observer) {
      20. observerList.remove(observer);
      21. }
      22. /**
      23. * 通知所有观察者
      24. * @param message
      25. */
      26. @Override
      27. public void notify(String message) {
      28. for (Observer observer : observerList) {
      29. observer.update(message);
      30. }
      31. }
      32. }

      ```java public class ObserverTest { public static void main(String[] args) {

      1. // 观察者
      2. Observer observer1 = new ConcreteObserver("张三");
      3. Observer observer2 = new ConcreteObserver("李四");
      4. Observer observer3 = new ConcreteObserver("王五");
      5. // 主题
      6. Subject subject = new ConcreteSubject();
      7. subject.add(observer1);
      8. subject.add(observer2);
      9. subject.add(observer3);
      10. subject.notify("第一条朋友圈");
      11. System.out.println();
      12. subject.remove(observer3);
      13. subject.notify("第二条朋友圈");

      } } ——输出—— 张三 收到了动态:第一条朋友圈 李四 收到了动态:第一条朋友圈 王五 收到了动态:第一条朋友圈

    张三 收到了动态:第二条朋友圈 李四 收到了动态:第二条朋友圈 ```