什么是观察者模式?

一、观察者模式

  1. 概念和场景
    观察者模式又叫发布者订阅者模式,它定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己
    如:你订阅游戏主播,当主播开播的时候他就会给你推送开播消息;
    使用观察者模式的好处:
    1.1支持简单的广播通信,自动通知所有已订阅的对象。
    1.2页面载入后目标元素容易和观察者者存在一种动态关联,增加了灵活性。
    1.3目标对象与观察者之间的抽象耦合关系能够单独扩展及运用。

2、观察者模式代码:

 window.onload = function(){
let obs = new Observer();
// 1、订阅第一个文本框的内容
obs.addSubscribe(function(what){
    $("#sqrNum").value = what*what;
})
obs.addSubscribe(function(what){
    $("#cubeNum").value = what*what*what;
})
obs.addSubscribe(function(what){
    $("#fourNum").value = what*what*what*what;
})

// 2、发布(当第一个文本框的内容发生变化时,进行发布)
$("#num").oninput = function(){
    obs.publish(this.value);
}

}
class Observer{
constructor(){
this.arr = [];//保存所有的订阅者
}

// 添加订阅者
addSubscribe(callback){
    this.arr.push(callback);
}

// 删除订阅者
removeSubscribe(callback){        
    let index = this.arr.indexOf(callback);
    this.arr.splice(index,1);
}

// 发布
publish(what){
    // ES5新增的数组的方法
    for(let i=0;i<this.arr.length;i++){
        this.arr[i](what)
    }
}

}

二、设计模式的解释(借鉴)

​ 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。其实就是前人总结的,针对特定类型问题的类设计方案(代码的结构)
​ 总体来说设计模式分为三大类:
1、创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
2、结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3、行为型模式:共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
​ 设计模式遵循的原则:开闭原则(Open Close Principle)
​ 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行扩展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。

三、单例模式

1、场景:

某个类只允许创建一个实例,这就是单例模式。优点如下:
​ 1)、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销
​ 2)、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
​ 3)、有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如:中国国家主席只有一个,飞机大战的地图对象只有一个),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程。

四、工厂模式

1、场景

​ 工厂模式,就是用工厂的思路,创建对象。工厂是造产品的。现在用工厂来造对象。即一个工厂可以制造很多种类型的对象,这些对象一般具有共同的父类,即相似的类。
以下几种情景下工厂模式特别有用:

  • ​ 对象的构建十分复杂
  • ​ 需要依赖具体环境创建不同实例
  • ​ 处理大量具有相同属性的小对象
2、代码

需要:使用工厂模式创建html标签。
使用json对象的方式:

五、代理模式

1、概念和应用场景

​ 代理模式的定义是把对一个对象的访问, 交给另一个代理对象来操作。
​ 如:
​ 一般人需要打官司,需要找代理律师(术业有专攻);
​ 你需要打扫房子,可以找保洁公司(术业有专攻);
​ 我们在租房子的时候去找中介(因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做)

应用场景:
如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
代码展示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值