## :-: 觀察者模式
### 觀察者模式
**觀察者模式指的是一個對象(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