<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>观察者模式</title> </head> <body> <div class="eg2"></div> <script> // 观察者构造函数 class Observer { constructor(name, fn = () => {}) { this.name = name; this.fn = fn; } } // 创建观察者 const praepostor = new Observer("级长", (state) => { console.log(`因为: ${state}, 你是哪个班的`); }); const teacher = new Observer("老师", (state) => { console.log(`因为: ${state}, 把你爸找来`); }); const principal = new Observer("校长", (state) => { console.log(`因为: ${state}, 骂你的班主任`); }); // 被观察者的构造函数 class Subject { constructor(state) { // 记录状态 this.state = state; // 缓存需要通知被观察者 this.observsers = []; } // 设置状态 setState(val) { this.state = val; this.observsers.forEach((item) => { item.fn(this.state); }); } addObserver(obs) { this.observsers = this.observsers.filter((item) => item !== obs); this.observsers.push(obs); } delObserver(obs) { this.observsers = this.observsers.filter((item) => item !== obs); } } // 创造一个被观察者 const zhangsan = new Subject("学习"); zhangsan.addObserver(praepostor); zhangsan.addObserver(teacher); zhangsan.addObserver(principal); const lisi = new Subject("学习"); lisi.addObserver(teacher); lisi.addObserver(principal); console.log(zhangsan); console.log(lisi); </script> </body></html>