一、观察者模式
- 概念和场景
观察者模式又叫发布者订阅者模式,它定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己
如:你订阅游戏主播,当主播开播的时候他就会给你推送开播消息;
使用观察者模式的好处:
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、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
代码展示: