javascript设计模式与开发实践

综述:基于javascript设计模式与开发实践(曾探著)一书所写,算是学习笔记吧,16种常见设计模式简述。先将设计模式的概念讲清楚,便于初学者学习,代码很基础,有一个概念很重要。

 示例代码下载链接:http://www.ituring.com.cn/book/1632      ---随书下载

1.设计模式的概念和设计原则

1.1设计模式的概念
      设计模式一套被反复使用、思想成熟、经过分类和无数实战设计经验总结的。使用设计模式是为了让系统代码可复用、可扩展、可解耦、更容易被人理解且能保证代码可靠性。设计模式是代码真正工程化;设计模式是软件工程的基石脉络;如同大厦的结构一样。只有夯实地基结构,才能盖好健壮的大楼。也是我们迈向高级开发人员必经的一步;JavaScript是一门特别灵活的语言,早些年被认为是玩具式的语言,只能做一点为网页涂脂抹粉的小事。项目工程也不是很大,更无从说起设计模式在JavaScript的应用,但随着nodejs以及H5和web2.0的兴起,JavaScript变得越来越受重视。
1.2设计模式的原则
       设计模式存在的根本原因是为了代码的复用;增加可维护性。如下原则:

  • 开闭原则:对扩展开放,对修改关闭。
  • 里氏转换原则:子类继承父类,单独拿出来完全可以运行;
  • 依赖倒转原则:引用一个对象,如果这个对象有底层类型,直接引用底层;
  • 接口隔离原则:每一个接口应该是一个角色;
  • 和成/聚合复用原则:新的对象应使用一些已有的对象,使之成为新的对象的一部分;
  • 迪米特原则:一个对象应对其他对象有尽可能少的了解;

2.十六种设计模式介绍

2.1 单例模式
       在JavaScript里,实现单例的方式有很多种,其中最简单的一个方式是使用对象字面量的方法,其字面量里可以包含大量的属性和方法,减少了全局变量,避免了命名空间的污染。在开发中十分常用,第一次组织代码的方式就是使用单例模式组织代码的;

//单例模式示例
var mySingleton={
    property1:"something",
    property2:"songthing else",
    method1:funciton(){
        console.log("hello world");
  }
}

2.2 策略模式

策略模式指的是定义一系列的算法,把他们一个个封装起来,并且使他们可以互相替换。多用来处理if 、else if的页面逻辑;比如根据评价等级和工资水平来计算年终奖问题

//代理模式示例
var strategies={
    "S":function(salary){
        return  salary *4;
    },
    "A":function(salary){
        return  salary *3;
    },
    "B":function(salary){
        return salary * 2;
    }
}
var calculateBonus=function(level,salary){
    return stragegies[level](salary);
}
console.log(calculateBonus("S",20000));  //80000
console.log(calculateBonus("A",10000));  //30000

2.3 代理模式

2.3.1保护代理

2.3.2虚拟代理

2.3.3 缓存代理(这个问题在明源云的面试问题中有涉及,非常的有用)

缓存代理可以为一些开销大的运算结果提供暂时的存储,在下次运算时,如果传递进来的参数跟之前一致,则直接返回前面存储的运算结果。

/**************** 计算乘积 *****************/
	var mult = function(){
		var a = 1;
		for ( var i = 0, l = arguments.length; i < l; i++ ){
			a = a * arguments[i];
		}
		return a;
	};
	/**************** 计算加和 *****************/
	var plus = function(){
		var a = 0;
		for ( var i = 0, l = arguments.length; i < l; i++ ){
			a = a + arguments[i];
		}
		return a;
	};
	/**************** 创建缓存代理的工厂 *****************/
	var createProxyFactory = function( fn ){
		var cache = {};
		return function(){
			var args = Array.prototype.join.call( arguments, ',' );
			if ( args in cache ){
				return cache[ args ];
			}
			return cache[ args ] = fn.apply( this, arguments );
		}
	};

	var proxyMult = createProxyFactory( mult ),
	proxyPlus = createProxyFactory( plus );
	alert ( proxyMult( 1, 2, 3, 4 ) ); // 输出:24
	alert ( proxyMult( 1, 2, 3, 4 ) ); // 输出:24
	alert ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10
	alert ( proxyPlus( 1, 2, 3, 4 ) ); // 输出:10

2.4 迭代器模式

2.5 发布-订阅模式(也叫作观察者模式,这是一个十分重要的设计模式,在工作中用的特别多,Vue的源码中主要使用了发布订阅者模式和代理模式),在lazyMan中也有大量的考察。

 var salesOffices={};
    salesOffices.clientList=[];
    salesOffices.listen=function(fn){
       this.clientList.push(fn);  //将订阅的消息添加到缓存列表,按照队列的方式来分别执行相应的执行模块
    };
    salesOffices.trigger=function(){
       for(var i=0,fn;fn=this.clientList[i++];){
           fn.apply(this,arguments); //循环调用缓存队列中的函数
       }
    };
    //定义第一个处理函数
    salesOffices.listen(function(prices,squarMeter){
        setTimeout(function(){
            console.log("产品价格是:"+prices,"房屋面积是:"+squarMeter);
        },3000);
    });
   //定义第二个处理函数
    salesOffices.listen(function(prices,squarMeter){
        console.log("产品价格是666:"+prices,"房屋面积是6666:"+squarMeter);
    });
    //以下还可以定义多个其他函数
    salesOffices.trigger(3000,20); //传入参数,按照顺序执行相应的函数,从上往下执行

2.6 命令模式

2.7 组合模式

2.8 模板方法模式

2.9 享元模式

2.10 职责链模式

2.11 中介者模式

2.12 装饰者模式

2.13 状态模式

2.14 适配器模式

3.设计原则和编程技巧

3.1 单一职责原则

3.2 最少知识原则

3.3 开放-封闭原则

3.4 接口和面向接口编程

4.代码重构的建议

 

---未完待续

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章