概念:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
核心:一个对象的改变需要同时改变其他对象的时候考虑观察者
注意对观察者和通知者进行抽象(依赖倒置)

观察者结构图

image.png

java代码

  1. public class ObserverTest {
  2. public static void main(String[] args) {
  3. //生成通知者
  4. Observer observer = new StockObserver();
  5. Observer observer2 = new NBAObserver();
  6. //生成观察者
  7. Subject subject = new Boss();
  8. subject.name = "老板";
  9. observer.subject = subject;
  10. observer2.subject= subject;
  11. subject.Attach(observer);
  12. subject.Attach(observer2);
  13. //通知
  14. subject.Notify();
  15. }
  16. }
  17. //观察者
  18. public abstract class Subject {
  19. String name = "";
  20. public abstract void Attach(Observer observer);
  21. public abstract void Detach(Observer observer);
  22. abstract void Notify();
  23. }
  24. //老板观察者
  25. public class Boss extends Subject {
  26. private List<Observer> observers = new ArrayList<>();
  27. @Override
  28. public void Attach(Observer observer) {
  29. observers.add(observer);
  30. }
  31. @Override
  32. public void Detach(Observer observer) {
  33. observers.remove(observer);
  34. }
  35. @Override
  36. public void Notify() {
  37. for (Observer observer : observers) {
  38. observer.Update();
  39. }
  40. }
  41. }
  42. //通知者
  43. public abstract class Observer {
  44. String name;
  45. Subject subject;
  46. public abstract void Update();
  47. }
  48. //观看NBA的通知者
  49. public class NBAObserver extends Observer {
  50. @Override
  51. public void Update() {
  52. System.out.println(subject.name + "通知,关闭了NBA比赛,继续工作");
  53. }
  54. }
  55. //观看股票的通知者
  56. public class StockObserver extends Observer {
  57. @Override
  58. public void Update() {
  59. System.out.println(subject.name + "通知,关闭股票行情,继续工作!");
  60. }
  61. }

针对不同的通知方法名字,不能使用接口,因为名称不同,可以使用委托

委托(不理解)

声明一个委托,名称叫“EventHandler”,无参数,无返回值

  1. void EventHandler();