1.模块模式:
在立即执行函数表达式中定义的变量和方法在外界是访问不到的,只能通过其向外部提供的接口,"有限制"地访问.通过函数作用域解决了属性和方法的封装问题.
|
2.构造函数模式
|
3.混合模式
|
4.工厂模式
|
5.单例模式
|
6.发布-订阅模式:
发布-订阅模式又叫做观察者模式,定义了对象之间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖与它的对象都将得到通知.
发布-订阅模式广泛应用于异步编程之中,是一种替代回调函数的方案.多个事件处理函数可以订阅同一个事件,当该事件发生后,与其相对应的多个事件处理函数都会运行
取代对象之间硬编码的通知机制,一个对象不用再显示的调用另外一个对象的某个接口,降低模块之间的耦合程度,虽然不清楚彼此的细节,但是不影响他们之间相互通信
应用
DOM事件
DOM事件是一种典型的发布-订阅模式,对一个dom节点的一个事件进行监听,当操作dom节点时,触发相应的事件,响应函数执行.事件函数对dom节点完全未知,不用去理会是什么事件,如何触发,执行就好.
自定义事件
指定发布者
"发布-订阅"这种关系用一个对象表示,键表示事件名,值是一个由事件处理程序组成的数组,相当于订阅者的花名册
发布消息后,遍历缓存列表,依次执行订阅者的回调函数
|
实际应用
|
7.单体模式
// 单体模式又称模块模式:用一个命名空间包含自己的所有代码的全局对象 // 简单单体模式 var timer = { seconds: 0, start: function () { setInterval(() => { this.seconds++ }, 1000); }, doFunc() { console.log('单体模式') } } setTimeout(() => { timer.doFunc() }, 3000); // 单体模式表现形式2 var person = function personInfo(params) { this.name = 'name'; this.getName = function () { // doSomeThing } this.method = function () { // doSomeThing } } // 单体模式+闭包表现形式 // 模块模式 var DJtest = {} DJtest.common = function () { // doSomeThing } DJtest.init = function () { // doSomeThing } DJtest.func = function () { var val = 1 function add1(str) { return parseInt(str) + val++ } console.log(add1(1)) // 2 return { sumAdd: function (str) { return add1(str) } } }() console.log(DJtest.func.sumAdd(1)) // 3 console.log(DJtest.func.sumAdd(1)) // 4 console.log(DJtest.func.sumAdd(1)) // 5
8.策略模式
// 策略模式的定义是:定义一系列的算法/业务规则,把它们一个个封装起来,并且使它们可以相互替换。 // demo:根据级别计算奖金 var calculateBouns = function(salary,level) { if(level === 'A') { return salary * 4; } if(level === 'B') { return salary * 3; } if(level === 'C') { return salary * 2; } }; console.log(calculateBouns(4000,'A')); // 16000 console.log(calculateBouns(2500,'B')); // 7500 /** * describe: * 1,函数包含了很多if-else语句; * 2,函数缺乏弹性,扩展需要添加新的if,else; * 3,复用差 * */ // 策略模式改造 var obj = { "A": function (salary) { return salary * 4; }, "B": function (salary) { return salary * 3; }, "C": function (salary) { return salary * 2; } }; var calculateBouns = function (level, salary) { return obj[level](salary); }; console.log(calculateBouns('A',10000)); // 40000 // 优点:1. 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句。 // 2. 策略模式提供了开放-封闭原则,使代码更容易理解和扩展。 // 3. 策略模式中的代码可以复用。 // tips:开放-封闭原则:对于扩展是开放的(Open for extension),对于更改是封闭的(Closed for modification)