JS中简单实现观察者模式

JS中简单实现观察者模式

1.1什么是观察者模式

1.1.1观察者模式图解

想要更加深入的了解观察者模式可以去看Vue中的观察者模式
在这里插入图片描述
当然,JS中可没有真正意义上的接口这个东西,所以下面属于接口解耦的那一部分图解可以在这里忽略不计。

1.1.2观察者模式文字阐述

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如一个对象被修改时,会通知依赖他的对象。观察者模式属于行为型设计模式。

  • 意图:定义对象间的一种一对多的依赖关系,当对象发生改变时,所有依赖他的对象都会自动得到通知并更新,不主动触发,而是被动监听,让二者产生解耦。
  • 主要解决:一个对象改变通知其他对象,考虑到低耦合,高度协作。
  • 何时使用:如一个对象被修改时,会通知依赖他的对象。
  • 如何解决:使用面向对象技术,可以将类之间的依赖关系弱化

不多说了直接上代码

1.2 JS中的代码实现

1.2.1目标类

用于存放观察者类对象,当目标类发生改变时会通知所有观察者

class SubjectBase {
    constructor() {
        // 用于存放观察者
        this.observerList = [];
    }
    /**
     * 调用观察者
     */
    notify() {
        this.observerList.forEach(o => {
            o.update();
        });
    }
    /**
     * 添加观察者
     * @param {*} observer 
     */
    attach(observer) {
        this.observerList.push(observer);
    }
    /**
     * 移除观察者
     * @param {*} observer 
     */
    detach(observer) {
        var index = this.observerList.findIndex(observer);
        this.observerList.splice(index, 1);
    }
}

为目标类设置私有成员变量,当该变量发生改变时(调用set方法)同时调用观察者类的update方法

class Subject extends SubjectBase {
    constructor() {
        super();
        // 设置私有成员变量state,设置state时触发观察者
        this.state = 0;
    }
    getState() {
        return this.state;
    }
    setState(state) {
        if (state != this.state) {
            this.state = state;
            this.notify();
        }
    }
}

1.2.2观察者类

将目标类作为参数传入观察者类的构造函数,同时调用目标类中将该观察者对象Push进观察者集合中的方法,然后再调用目标类的Set方法时循环调用观察者集合中的每一个观察者对象的update()用来通知每一个观察者类,目标类发生了改变。

/**
 * 观察者类
 */
class Observer {
    constructor(name, subject) {
        this.name = name;
        this.subject = subject;
        subject.attach(this);
    }

    update() {
        console.log(`${this.name} is updateing, 目标类被改变 state is ${this.subject.getState()}`);
    }
}

1.2.3 HTML展示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./ObserverPattern.js"></script>
    <script>
       //实例化目标类
        var subject = new Subject();
        //实例化多个被观察者
        var ob1 = new Observer("被观察者1",subject);
        var ob2 = new Observer("被观察者2",subject);
        var ob3 = new Observer("被观察者3",subject);
        var ob4 = new Observer("被观察者4",subject);
        //调用目标类Set方法改变目标类中的私有变量
        subject.setState(1);
    </script>
</head>
<body>
    
</body>
</html>

在这里插入图片描述

通过控制台输出可以看出目标类状态从0变为1后所有被观察者的update方法被调用并通知给每一个观察者类,目标类已发生改变。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值