## :-: 观察者模式
### 观察者模式
**观察者模式指的是一个对象(Subject)[被观察者]维持一系列依赖于它的对象(Observer)[观察者],当有关状态发生变更时 Subject 对象则通知一系列 Observer 对象进行更新。**
#### 定义被观察者
```
/**
* 观察者模式 一个被观察者去维护一组观察者,
* 被观察者拥有添加, 移除观察者的能力 ,并有权利向这一组观察者发布广播消息
* 观察者有更新状态的数据的能力
*/
/**
* 被观察者
*/
export class Subject {
private observers: Array<any>;
constructor() {
this.observers = []
}
/**
* 添加观察者
*/
public addObserver(observer:any): void {
this.observers.push(observer);
}
/**
* 移除观察者
*/
public removeObserver(observer:any): void {
const observers = this.observers;
for(let i = 0;i < observers.length;i++){
if(observers[i] === observer){
observers.splice(i,1);
}
}
}
/**
* 这是发布消息
*/
public notify():void {
const observers = this.observers;
// 广播数据 执行所有观察者的更新方法
for(let i = 0;i < observers.length;i++){
observers[i].update();
}
}
}
/**
* 编译视图
*/
export class DocumentRender {
private doc: any;
constructor(doc: any, state: any) {
this.doc = doc;
}
public renderApp(state: Object): string {
let str: string = '';
console.log( state)
return str
}
}
/**
* 更新编译数据
* 观察者
*/
export class Observer {
private state: State;
constructor(state: State) {
this.state = state
}
public update(): void {
console.log('数据中的name变了' + this.state.name);
console.log('数据中的name变了' + this.state.age);
console.log('数据的sex变了' + this.state.sex);
}
}
/**
* 规范数据类型
*/
export interface State {
name?: string,
age?: number,
sex?: string,
}
```
#### 模拟数据变更
```
import { DocumentRender, Subject, Observer, State } from './moduls/Observer'
const subject = new Subject();
const observer2 = new Observer({name: 'LiLi',age:22,sex:'女'});
setTimeout(()=> {
const observer1 = new Observer({name:'marvin',age:20,sex:'男'});
subject.addObserver(observer1);
subject.notify();
},2000);
subject.addObserver(observer2);
subject.notify();
```
### 发布订阅模式
- css用法技巧
- 阴影被后面div遮挡
- 绘制一个三角形
- 图像的灰白处理
- 一切居中
- 禁用鼠标事件
- 模糊文本
- 字体省略号
- 垂直居中
- box投影
- css动画
- javaScript常见工具封装
- 地址栏参数获取
- 日期格式化
- Ajax
- scroll
- 缓动函数
- 事件绑定
- 阻止冒泡和默认行为
- 伪数组正常化
- 日期生成
- 拷贝
- javaScript基本知识
- javaScript基本知识
- javascript常见代码块
- vue常见问题
- 获取参数
- vue常见问题/vue混入
- v-html指令问题集锦
- 正则获取html中所有的中文字符
- 时间格式化
- 监听路由的变化
- vue移动端滑动事件
- vue移动端图片点击放大
- 打包后背景图片404的问题
- webpack打包后部分样式失效
- IE的兼容问题
- post请求后台无法接受参数
- 验证码
- vue开启Gzip报错
- v-html修改样式
- app.css文件过大
- vue中中使用iframe
- babel对es6编译不彻底 出现ie不兼容的问题
- vue单页应用优化
- 吸顶问题
- 跨域session无法共享
- 登陆返回上一页
- axois中使用delete数据传递问题
- 监听数组对象数组中的属性
- webpack
- webpack基本使用
- webpack打包删除注释
- js插件
- 轮播图
- 面向对象模板
- 左滑右滑
- 存储
- appcan
- appcan
- js深入研究
- 数组的参数传递问题
- 采用jquery的方法载入公共页面后出现闪烁的问题
- html拼接无法绑定事件
- 吸顶问题
- async配合promise使用
- flutter
- 模拟器加载报错
- 底部导航实现
- 模拟器出现错误
- flutter在idea下的快捷键
- flutter学习笔记
- 设计模式
- 观察者模式
- nest
- nest基本说明
- nest错误处理
- vue高级
- 动态注入路由
- nest实战
- 一项目准备
- window
- 端口进程被占
- mis包
- reactNative
- react-native-router-flux
- esLint
- eslint
- Cesium