1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8" />
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    7. <title>观察者模式</title>
    8. </head>
    9. <body>
    10. <div class="eg2"></div>
    11. <script>
    12. // 观察者构造函数
    13. class Observer {
    14. constructor(name, fn = () => {}) {
    15. this.name = name;
    16. this.fn = fn;
    17. }
    18. }
    19. // 创建观察者
    20. const praepostor = new Observer("级长", (state) => {
    21. console.log(`因为: ${state}, 你是哪个班的`);
    22. });
    23. const teacher = new Observer("老师", (state) => {
    24. console.log(`因为: ${state}, 把你爸找来`);
    25. });
    26. const principal = new Observer("校长", (state) => {
    27. console.log(`因为: ${state}, 骂你的班主任`);
    28. });
    29. // 被观察者的构造函数
    30. class Subject {
    31. constructor(state) {
    32. // 记录状态
    33. this.state = state;
    34. // 缓存需要通知被观察者
    35. this.observsers = [];
    36. }
    37. // 设置状态
    38. setState(val) {
    39. this.state = val;
    40. this.observsers.forEach((item) => {
    41. item.fn(this.state);
    42. });
    43. }
    44. addObserver(obs) {
    45. this.observsers = this.observsers.filter((item) => item !== obs);
    46. this.observsers.push(obs);
    47. }
    48. delObserver(obs) {
    49. this.observsers = this.observsers.filter((item) => item !== obs);
    50. }
    51. }
    52. // 创造一个被观察者
    53. const zhangsan = new Subject("学习");
    54. zhangsan.addObserver(praepostor);
    55. zhangsan.addObserver(teacher);
    56. zhangsan.addObserver(principal);
    57. const lisi = new Subject("学习");
    58. lisi.addObserver(teacher);
    59. lisi.addObserver(principal);
    60. console.log(zhangsan);
    61. console.log(lisi);
    62. </script>
    63. </body>
    64. </html>