当前位置: 首页 > wzjs >正文

房地产销售额引擎优化seo

房地产销售额,引擎优化seo,wordpress社交链接图标,百度做公司网站需要多少钱一、模式本质 观察者模式(Observer Pattern)建立​​对象间的一对多依赖关系​​,当核心对象(Subject)状态变化时,自动通知所有订阅者(Observers)。 这是一种​​推模型​​的典型…

一、模式本质

观察者模式(Observer Pattern)建立​​对象间的一对多依赖关系​​,当核心对象(Subject)状态变化时,自动通知所有订阅者(Observers)。

这是一种​​推模型​​的典型实现,常用于解耦生产者和消费者。

二、核心实现(TypeScript)

// 抽象主题接口
interface Subject {addObserver(obs: Observer): void;removeObserver(obs: Observer): void;notifyObservers(): void;
}// 具体主题实现
class ConcreteSubject implements Subject {private observers: Observer[] = [];private state: number = 0;// 添加观察者时进行引用校验addObserver(obs: Observer): void {if (!this.observers.includes(obs)) {this.observers.push(obs);} else {console.warn('Observer already exists');}}// 使用过滤器避免splice索引问题removeObserver(obs: Observer): void {const initialLength = this.observers.length;this.observers = this.observers.filter(o => o !== obs);if (initialLength === this.observers.length) {console.warn('Observer not found');}}notifyObservers(): void {// 克隆数组防止迭代过程中被修改const observersCopy = [...this.observers];observersCopy.forEach(obs => obs.update(this.state));}// 业务方法触发状态变化setState(newState: number): void {this.state = newState;this.notifyObservers();}
}// 观察者接口
interface Observer {update(state: number): void;
}// 具体观察者
class ConcreteObserver implements Observer {constructor(private name: string) {}update(state: number): void {console.log(`[${this.name}] Received state update:`, state);// 这里可以触发视图更新等操作}
}

三、应用场景建议

1. 复杂表单联动验证

// 表单字段基类
abstract class FormField {private validators: Validator[] = [];addValidator(v: Validator) {this.validators.push(v);}validate() {const errors = this.validators.map(v => v.validate(this.value));return errors.filter(e => e !== null);}
}// 实际字段实现
class EmailField extends FormField {value: string = '';
}// 验证器接口
interface Validator {validate(value: any): string | null;
}// 使用示例
const emailField = new EmailField();
emailField.addValidator({validate: (value) => !/.+@.+\..+/.test(value) ? 'Invalid email' : null
});

2. WebSocket消息广播

class WebSocketManager implements Subject {private static instance: WebSocketManager;private ws: WebSocket;private observers: Observer[] = [];private constructor() {this.ws = new WebSocket('wss://api.example.com');this.ws.onmessage = (event) => {this.notifyObservers(JSON.parse(event.data));};}static getInstance(): WebSocketManager {if (!this.instance) {this.instance = new WebSocketManager();}return this.instance;}// 实现Subject接口方法...
}

3. 复杂状态管理

// 增强型状态管理
class Store<T> implements Subject {private state: T;private observers: Observer[] = [];constructor(initialState: T) {this.state = initialState;}setState(newState: Partial<T>) {this.state = { ...this.state, ...newState };this.notifyObservers();}// 支持选择器订阅subscribe(selector: (state: T) => any, callback: (value: any) => void) {const observer = {update: () => {const selected = selector(this.state);callback(selected);}};this.addObserver(observer);return () => this.removeObserver(observer);}
}

四、关键注意事项

1. 内存泄漏防护

// 使用WeakMap避免强引用
const observerMap = new WeakMap<Subject, Set<Observer>>();class SafeSubject implements Subject {constructor() {observerMap.set(this, new Set());}addObserver(obs: Observer) {observerMap.get(this)?.add(obs);}// 自动清理无效引用notifyObservers() {const observers = observerMap.get(this);if (!observers) return;for (const obs of observers) {if (typeof obs.update !== 'function') {observers.delete(obs);} else {obs.update(this.state);}}}
}

2. 批量更新优化

class BatchedSubject extends ConcreteSubject {private updateQueue = new Set<Observer>();private isBatching = false;notifyObservers() {if (this.isBatching) return;this.isBatching = true;requestAnimationFrame(() => {super.notifyObservers();this.isBatching = false;this.updateQueue.clear();});}// 重写状态更新方法setState(newState: number) {super.setState(newState);if (this.isBatching) {this.updateQueue.add(...this.observers);}}
}

3. 异步通知处理

class AsyncSubject extends ConcreteSubject {async notifyObservers() {const promises = this.observers.map(async obs => {try {await obs.update(this.state);} catch (error) {console.error('Observer error:', error);}});await Promise.allSettled(promises);}
}

五、模式对比

特性观察者模式发布-订阅模式
耦合程度直接引用通过中间层
通信方式同步/异步通常异步
关系复杂度1:NM:N
典型应用对象状态通知系统级别事件
内存管理难度较高较低

六、最佳实践建议

  1. ​优先使用组合​​:通过构造函数注入观察者

    class DataLoader {constructor(private notifier: Subject) {}async load() {try {const data = await fetchData();this.notifier.setState({ data });} catch (error) {this.notifier.setState({ error });}}
    }
  2. ​防御性编程​​:添加观察者生命周期管理

    interface Observer {update(state: any): void;destroy?(): void;
    }class SafeSubject {private observers = new Set<Observer>();notifyObservers() {this.observers.forEach(obs => {if (typeof obs.update === 'function') {try {obs.update(this.state);} catch (error) {console.error('Observer error:', error);if (typeof obs.destroy === 'function') {obs.destroy();this.observers.delete(obs);}}}});}
    }
  3. ​性能监控​​:添加观察者执行耗时统计

    class InstrumentedSubject extends ConcreteSubject {notifyObservers() {this.observers.forEach(obs => {const start = performance.now();obs.update(this.state);const duration = performance.now() - start;if (duration > 100) {console.warn(`Slow observer: ${obs.constructor.name} took ${duration}ms`);}});}
    }

七、常见面试问题

  1. ​如何防止观察者执行阻塞主线程?​

    • 答:采用异步通知机制,使用微任务队列或Web Worker
  2. ​观察者模式与响应式编程的关系?​

    • 答:RxJS等库的Observable是观察者模式的演进,增加了流处理能力
  3. ​如何处理观察者之间的依赖关系?​

    • 答:引入优先级机制或拓扑排序,但需谨慎处理避免循环依赖
  4. ​在Vue/React中的具体应用?​

    • 答:Vue的响应式系统基于观察者模式,React的Context API可视为变体实现。
http://www.dtcms.com/wzjs/46369.html

相关文章:

  • 小卖部做网站seo北京
  • wordpress极简杂志主题福建网络seo关键词优化教程
  • 站长统计向日葵app下载最近10个新闻
  • 保定网站制作报价做百度网站一年多少钱
  • 低价网站建设浩森宇特百度站长工具收费吗
  • 有哪些网站可以做外贸百度云盘资源搜索
  • 网赚网站怎么做b站推广费用一般多少
  • 3gcms企业手机网站整站源码asp电商推广平台有哪些
  • 电力建设网站进不去网站流量数据分析
  • 网站开发大学是什么专业逆冬seo
  • 一般网站的宽度是多少国家税务总局网
  • 找网站做网站做网站网站监测
  • 经典网站域名百度账号人工申诉
  • 海南最新通知今天重要消息百seo排名优化
  • 国家建设部官方网站赵宏彦h5制作
  • 网站在建设中是什么意思云南今日头条新闻
  • 网站制作和优化专注于seo顾问
  • 做网站公司项目的流程公司网页制作流程
  • 网站域名登录不了百度导航2023年最新版
  • 疫情防控措施调整常州网站优化
  • 做电话销售需要的网站seo专业培训需要多久
  • 深圳网站制作品牌祥奔科技产品推广活动策划方案
  • wordpress 站点地址 wordpress地址网站流量来源
  • 网页设计和网站建设的区别成都网络营销搜索推广
  • 电子商城网站开发 pdf百度推广登录入口电脑
  • 建设银行流水假的真伪查询网站关键词推广和定向推广
  • 某学校网站建设方案论文账户竞价托管哪里好
  • 使用tag的网站专业网络推广外包
  • 可以做彩票网站的工作室来宾seo
  • 建设工程规划许可证查询网站集合竞价口诀背熟6句