美文网首页设计模式
用ts学习观察者模式

用ts学习观察者模式

作者: 潘杉杉_06_03 | 来源:发表于2018-10-26 22:36 被阅读95次

观察者模式 (Observer Pattern)

定义:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

举个例子: 气象站

主题是天气。

根据检测到的天气,需要展示不同的信息,比如

以下四个观察者:

1、观察最高温度,最低温度,平均温度。
2、观察天气推荐穿衣搭配的建议。
3、观察显示当前天气的各种数据。
4、观察预测将来的天气(天气预报)。

学习观察者模式需要了解的知识点:

主题

主题是被观察的对象,它持有许多观察者,可以动态的添加删除观察者,以及通知观察者自身的变化。

interface Subject {
    registerObserver(observer:Observer):void
    removeObserver(observer:Observer):void
    notifyObservers(observers?:Array<Observer>):void
}

以上是主题接口,对象使用此接口注册为观察者,或者把自己从观察者中删除。

观察者

观察者拥有一个 updata 函数,当收到主题的通知时调用 updata 更新数据。

interface Observer {
    updata(params?:any):void //根据实际项目自定义参数
}

以上是观察者接口,所有潜在的观察者必须实现观察者接口,这个接口只有 updata 一个方法。

使用观察者模式实现气象站

现在我们来用观察者来实现一个气象站。

实现天气主题

class WeatherData implements Subject {
    private observers: Array<Observer> // 观察者
    private temperature: number // 温度
    private humidity: number // 湿度
    private pressure: number // 压力
    constructor(){
        this.observers = []
        this.run()
    }
    public registerObserver(observer:Observer) { //注册观察者
        this.observers.push(observer)
    }
    public removeObserver(observer:Observer) { //注销观察者
        let index = this.observers.indexOf(observer)
        if(index!==-1){
            this.observers.splice(index,1)
        }
    }
    public notifyObservers(observers = this.observers) { // 通知观察者
        for(let observer of observers){
            observer.updata(this.temperature,this.humidity,this.pressure) // 更新
        }
    }
    getTemperature(){ // 获取温度
        return this.temperature
    }
    getHumidity(){ // 获取湿度
        return this.humidity
    }
    getPressure(){ // 获取压力
        return this.pressure
    }
    measurementsChange(temperature:number,humidity:number,pressure:number) {
        this.temperature = temperature
        this.humidity = humidity
        this.pressure = pressure
        this.notifyObservers() // 通知观察者
    }
    run(){
        setTimeout(() => {
            let temperature = Math.random()*38 - 10
            let humidity = Math.random()
            let pressure = 95 + Math.random()*5
            this.measurementsChange(Number(temperature.toFixed(1)),Number(humidity.toFixed(1)), Number(pressure.toFixed(1)))            
        }, 0);
        setInterval(()=>{
            let temperature = Math.random()*38 - 10
            let humidity = Math.random()
            let pressure = 95 + Math.random()*5
            this.measurementsChange(Number(temperature.toFixed(1)),Number(humidity.toFixed(1)), Number(pressure.toFixed(1)))
        },1000*4)
    }
}

实现当前天气

class CurrentWeatherDisplay implements Observer, DisplayElement{ // 当前天气
    private temperature: number // 温度
    private humidity: number // 湿度
    private pressure: number // 压力
    private view:HTMLElement // 布告栏天气视图
    constructor(view:HTMLElement){
        this.view = view
    }
    updata(temperature:number,humidity:number,pressure:number){
        this.temperature = temperature
        this.humidity = humidity
        this.pressure = pressure
        this.display()
    }
    display(){
        this.view.innerHTML= `
        <div>当前温度:${this.temperature.toFixed(2)}</div>
        <div>当前湿度:${this.humidity.toFixed(2)}</div>
        <div>当前压力:${this.pressure.toFixed(2)}</div>
        `
    }
}

初始化

    const bulletinBoard = document.body // 布告栏

    const weatherData = new WeatherData() // 天气
    
    const currentWeatherDisplayView = document.createElement('div') // 创建一个div显示 当前天气
    
    const currentWeatherDisplay = new CurrentWeatherDisplay(currentWeatherDisplayView) // 当前天气
    
    weatherData.registerObserver(currentWeatherDisplay) // 将当前天气注册成观察者

    bulletinBoard.appendChild( // 在布告栏绑定当前天气
        currentWeatherDisplayView
    )

相关代码 demo02

(完)

相关文章

  • 用ts学习观察者模式

    观察者模式 (Observer Pattern) 定义:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,...

  • 观察者模式

    观察者模式 我知道android的listview是用的观察者模式,Eventbus也是用的观察者模式。但是我还是...

  • 用ts学习策略模式

    策略模式 (Strategy Pattern) 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他...

  • 用ts学习命令模式

    命令模式 (Command Pattern) 定义: 将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数...

  • 用ts学习工厂模式

    工厂模式 (Factory Pattern) 定义: 定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。...

  • 用ts学习状态模式

    状态模式 (State Pattern) 定义:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的...

  • 用ts学习装饰器模式

    装饰器模式 (Decorator Pattern) 假如我们需要为一家咖啡店比如星巴克写一个自动售货系统,需要定义...

  • 用ts学习单件模式

    单件模式 (Singleton Pattern) 定义: 确保一个类只有一个实例,并提供一个局部访问点。 单件模式...

  • 用ts学习迭代器模式

    迭代器模式 (Iterator Pattern) 定义: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露...

  • 用ts学习模板方法模式

    模板方法模式 (Template Pattern) 定义: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类...

网友评论

    本文标题:用ts学习观察者模式

    本文链接:https://www.haomeiwen.com/subject/vfcrtqtx.html