JavaScript模式读书笔记 第7章 设计模式

1,单例模式

-1,最简单的单例:


<script>

	//obj为单例

	var obj = {

		

		myProp: "My Value"

	};

	var obj1 = obj;

	var obj2 = obj;

	console.log(obj1 == obj2);//true

	console.log(obj1 === obj2);//true

  </script>

-2,静态属性中的实例:


 <script>

	function Universe(){

		

		if(typeof Universe.instance === "object"){

			

			return Universe.instance;

		}

 

		this.start_time = 0;

		this.bang = "Big";

 

		Universe.instance = this;

	}

 

	var u1 = new Universe();

	var u2 = new Universe();

	console.log(u1 === u2);//true

  </script>

缺点:Universe.instance是公开的属性,其他代码可能无意更改此属性.

-3,闭包中的实例


  <script>

	 function Universe(){

		//缓存私有变量

		var instance = this;

 

		this.start_time = 0;

		this.bang = "Big";

		

		//重写构造函数,返回私有变量

		Universe = function(){

			

			return instance;

		};

	 }

	 var u1 = new Universe();

	 var u2 = new Universe();

	 console.log(u1 === u2);//true

  </script>

上述代码在第一次调用的时候返回this,在第二次、第三次调用的时候,将会重写构造函数,该重写构造函数通过闭包访问了私有的instance属性,并且只是简单返回该Instance。见如下代码:


 

  <script>

	 function Universe(){

		//缓存私有变量

		var instance = this;

 

		this.start_time = 0;

		this.bang = "Big";

		

		//重写构造函数,返回私有变量

		Universe = function(){

			

			return instance;

		};

	 }

	

	 Universe.prototype.nothing = true;

	 var u1 = new Universe();

	

		

	 Universe.prototype.everything = true;

     var u2 = new Universe();

 

	 

	 console.log(u1.nothing);//true

	 console.log(u2.nothing);//true

     console.log(u1.everything);//undefined

	 console.log(u2.everything);//undefined

  </script>

因为u1的constructor指向了原始的构造函数,而不是重新定义的构造函数。(这块还是没搞明白。。。。。。只是觉得好神奇)

下面的例子,在构造函数重新定义了对应的constructor。


 function Universe(){

		//缓存私有变量

		var instance ;

 

		

		

		//重写构造函数,返回私有变量

		Universe = function  Universe(){

			

			return instance;

		};

		//保留原属性

		Universe.prototype = this;

		//创建实例 

		instance = new Universe();

		//重置构造函数指针

		instance.constructor = Universe;

 

 

		this.start_time = 0;

		this.bang = "Big";

 

		return instance;

	 }

	

	 Universe.prototype.nothing = true;

	 var u1 = new Universe();

	

		

	 Universe.prototype.everything = true;

     var u2 = new Universe();

 

	 

	 console.log(u1.nothing);//true

	 console.log(u2.nothing);//true

     console.log(u1.everything);//true

	 console.log(u2.everything);//true

  </script>

2,工厂模式

设计工厂模式是为了创建对象,它通常在类或者类的静态方法中实现,具有下列目标:

a. 当创建相似对象时执行重复操作。

b.在编译时不知道具体类型的时候,为工厂客户提供一种创建对象的接口。


 

<script>

	 function CarMaker(){

		

		CarMaker.prototype.drive = function(){

			

			return "Vroom, I hava " + this.doors + " doors";

		};

 

		//静态工厂方法 

		CarMaker.factory = function(type){

			

			var constr = type, newCar;

 

			if(typeof CarMaker[constr] !== "function"){

				

				throw{

					name: "Error",

					message: constr + " doesn‘t exist";

				};

			}

			//工厂方法

			if(typeof CarMaker[constr].prototype.drive !== "function"){

				

				CarMaker[constr].prototype = new CarMaker();

			}

			

			newCar = new CarMaker[constr]();

			return newCar;

		};

 

		CarMaker.compact = function(){

			

			this.doors = 4;

		};

		

		CarMaker.convertible = function(){

			

			this.doors = 2;

		};

 

		CarMaker.SUN = function(){

			

			this.doors = 24;

		};

	 }

  </script>

内置工厂模式:


<script>

	var o = new Object(),

		n = new Object(1),

		s = Object(‘1‘),

		b = Object(true);

 

	

	console.log(o.constructor === Object);//true

	console.log(n.constructor === Number);//true

	console.log(s.constructor === String);//true

	console.log(b.constructor === Boolean);//true

  </script>

3,迭代器模式

遍历复杂数据结构,具体调用格式类似java集合类。


<script>

	var element;

	while(element = agg.next){

		

		//业务处理

		console.log(element);

	}

  </script>

 <script>

	var agg = (function(){

		

		var index = 0, 

			data = [1, 2, 3, 4, 5],

			length = data.length;

		

		return {

			

			next: function(){

				

				var element;

				if(!this.hasNext()){

					

					return null;

				}

				element = data[index];

				index = index + 1;

				return element;

			},

			hasNext: function(){

				

				return index < length;

			},

			rewind: function(){

				

				index = 0;

			},

			current: function(){

				

				return data[index];

			}

		};

	}());

	agg.rewind();

	console.log(agg.current());//1

	while(agg.hasNext()){

		

		console.log(agg.next());// 1 2 3 4 5

	}

  </script>

4,装饰者模式

装饰者模式,可以在运行时动态添加附加内容到对象中。装饰者模式可以从仅具有基本功能的普通对象开始,然后从可用装饰资源池中选择需要用于增强普通对象的那些功能,并且安装顺序进行装饰,尤其是当装饰顺序很重要的时候。

例如如下场景,根据固定的商品价格a,我们可以组合不同的税收,最后得出不同的最终价格。


  <script>

	var sale = new Sale(100);

	sale = sale.decorator("fedtax");//增加联邦税

	sale = sale.decorator("quebec");//增加省税

	sale = sale.decorator("money");//以美元形式展示

	sale.getPrice();//"$112.88"

 

	//使用不同的税收策略

	var sale = new Sale(100);

	sale = sale.decorator("fedtax");//增加联邦税

	sale = sale.decorator("cdn");//以cdn形式展示

	sale.getPrice();//"CDN$ 105.88"

  </script>

<script>

	

	function Sale(price){

		

		this.price = price || 100;

	}

	

	Sale.prototype.getPrice = function(){

		

		return this.price;

	};

	//装饰者对象

	Sale.decorators = {};

 

	//装饰者从父对象获取值,然后再修改该值

	Sale.decorators.fedtax = {

		

		getPrice: function(){

			

			var price = this.uber.getPrice();

			price += price * 0.005;

			return price;

		}

	};

	Sale.decorators.quebec = {

		

		getPrice: function(){

			

			var price = this.uber.getPrice();

			price += price * 0.075;

			return price;

		}

	};

	Sale.decorators.money = {

		

		getPrice: function(){

			

			return "$" + this.uber.getPrice().toFixed(2);

		}

	};

	Sale.decorators.cdn = {

		

		

		getPrice: function(){

			

			return "CDN$" + this.uber.getPrice().toFixed(2);

		}

	};

 

	Sale.prototype.decorator = function(decorator){

		

		var F = function(){},

				overrides = this.constructor.decorators[decorator],

				i, newobj;

		F.prototype = this;

 

		newobj = new F();

		newobj.uber = F.prototype;

		for(i in overrides){

			

			if(overrides.hasOwnProperty(i)){

				

				newobj[i] = overrides[i];

			}

		}

		return newobj;

	};

 

	var sale = new Sale(100);

	sale = sale.decorator("fedtax");//增加联邦税

	sale = sale.decorator("quebec");//增加省税

	sale = sale.decorator("money");//以美元形式展示

	console.log(sale.getPrice());//"$112.88"

 

	//使用不同的税收策略

	var sale = new Sale(100);

	sale = sale.decorator("fedtax");//增加联邦税

	sale = sale.decorator("cdn");//以cdn形式展示

	console.log(sale.getPrice());//"CDN$ 105.88"

  </script>

5,策略模式

时间: 2024-12-26 16:16:04

JavaScript模式读书笔记 第7章 设计模式的相关文章

JavaScript模式读书笔记 文章3章 文字和构造

1.对象字面量 -1.Javascript中所创建的自己定义对象在任务时候都是可变的.能够从一个空对象開始,依据须要添加函数.对象字面量模式能够使我们在创建对象的时候向其加入函数.       <script> //定义空对象 var dog = {}; //对空对象加入方法 dog.name = "Liubo"; //对对象添加方法 dog.getName = function(){ return dog.name; }; //改变属性和方法 dog.getName =

JavaScript模式读书笔记 第4章 函数

2014年11月10日 1,JavaScript函数具有两个特点: 函数是第一类对象    函数可以提供作用域 函数即对象,表现为: -1,函数可以在运行时动态创建,也可以在程序执行过程中创建. -2,函数可以分配给变量,可以将它们的引用复制到其他变量,可以被扩展,此外,函数还可以被删除. -3,可以做为参数传递给其他函数,,还可以由其他函数返回. -4,函数可以有自己的属性和方法. 2,声明VS表达式:名称和变量声明提升 //这是一个函数表达式 //它做为一个参数传递给函数 CallMe ca

JavaScript模式读书笔记 第3章 字面量和构造函数

1,对象字面量 -1,Javascript中所创建的自定义对象在任务时候都是可变的.可以从一个空对象开始,根据需要增加函数.对象字面量模式可以使我们在创建对象的时候向其添加函数.       <script> //定义空对象 var dog = {}; //对空对象添加方法 dog.name = "Liubo"; //对对象增加方法 dog.getName = function(){ return dog.name; }; //改变属性和方法 dog.getName = f

JavaScript模式读书笔记 第6章 代码复用模式

主要使用代码继承来完成复用. 1,使用类式继承. -1,类式继承:按照类的方式来实现继承,即所谓的类式. -2,类式继承:通过构造函数(child)获取来自parent的属性,从而创建对象. <script> //parent function Parent(name){ this.name = name || 'Adam'; } Parent.prototype.say = function(){   return this.name; } //child function Child(na

JavaScript模式读书笔记 第5章 对象创建模式 1

1,命名空间模式  namespace   <script> var myApp = {};//通过全局变量来实现命名空间 maApp.Parent = function (){   }; myApp.Child = function(){ };   </script> 通用命名空间函数   <script> //不安全代码 var myApp = {}; //安全代码 if(typeof myApp === "undefined"){ var my

【javascript dom读书笔记】 第九章 CSS-DOM

用dom设置样式 element.style.property = value 何时用dom脚本设置样式 作者写到:绝大多数的现代浏览器,虽然对css伪类的支持不是很完整,但是对dom都有良好的支持,所以需要考虑的是问题最简单的解决方案是什么,哪种解决方案会得到更多的浏览器支持. 在尝试了书中dom设置的实例以后,虽然代码比css要多很多,但是有一种操纵的快感,这应该是dom编程的艺术所在吧,有一种后端语言的感觉,至于实际使用中的选择,见仁见智做出更适合的自己的决定. 但最后作者说到有一种css

MySQL Cookbook读书笔记第5章

1,字符串属性 查看系统拥有那些字符集: 若需要来自多种语言存放到同一列中,会考虑Unicode字符集(utf8或ucs2),只有它能表示多语言的字符 有些字符集支持多字节,有些只包含单字节,判断是否支持多字节的方法是对比Length()h和char_length函数的返回值来判定字符串中是否有多字节.例如使用ucs2的字节长度为6,字符数目为3. 另外虽然Unicode字符集utf8包含多字节字符,但是一个具体的字符串有可能只包含单字节字 非二进制字符串另一特征是collation,决定字符集

Java编程思想第四版读书笔记——第十三章 字符串

Java编程思想第四版读书笔记--第十三章 字符串 字符串的操作是计算机程序设计中最常见的行为. 关键词: StringBuilder ,StringBuffer,toString(),format转换,正则表达式, 1.不可变String String对象时不可变的.每当把String对象作为方法的参数时,都会复制一份引用.(其实就是对函数中参数列表中参数的操作不会影响外面的原参数) 如下: import static net.mindview.util.Print.*; public cla

《浪潮之巅》读书笔记——第7章 Oracle

第7章 Oracle  纯软件公司的先驱    Microsoft 1975    Oracle 1977  公司发展    1977 SDL    1979 RSI 关系软件公司    1982 Oracle    当今全球第二大软件公司    钻了IBM空子 IBM不重视关系型数据库的开发,使Oracle先开发出来    赢在商业模式上,只买软件    使硬件厂商原因捆绑他的软件    IAF交互式开发工具可以使其他厂商做二次开发  关系型数据库    1970 IBM 埃德加.柯德提出