javascript常见的设计模式举例

    近日重读《javascript面型对象编程指南》这本书,最后一章介绍了常见的javascript设计模式的实现。主要讲解了四种设计模式:单例模式、工厂模式、装饰器模式和观察者模式。js作为动态语言,实现这四种模式的实例相对简单,当然既然称之为模式,那么吃透思想更重要,那么下面,由乐帝来实例讲解四种模式。

   1.单例模式

   顾名思义,对象构造出来的是实例,从字面上理解,单例即单实例,这意味一个类只能创建一个实例对象。当需要创建一种类型或者一个类的唯一对象时,可使用该模式。以下两个实例分别从全局变量和类属性两种角度构造单例。属于对象创建型模式。

function Logger(){
	if(typeof global_log==="undefined")
	{
		global_log=this;//没有在函数内定义global_log所以被看成全局变量,并且此时this为window为全局对象
		alert(this);//相当于初始化全局变量并且赋值为window,由于全局变量有唯一性,故可保证单例
	}
	return global_log;//但问题在于全局变量有可能被覆盖掉,造成实例流失
}
var a = new Logger();
var b = new Logger();
console.log(a===b);
//另外一种单例模式:构造器属性
function Logger(){//从面向对象的角度考虑,Logger是一个类
	if(typeof Logger.single_instance==="undefined"){
		Logger.single_instance=this;//Logger.single_instance则是类属性,这个也可以实现单例,类属性和私有属性不同,类属性是类实例公用的
		alert(this);
	}
	return Logger.single_instance;
}

var a=new Logger()
var b=new Logger()
a===b;

2.工厂模式

   总的来说,工厂模式属于创建对象型模式,当有多个相似对象不知用哪种,可以考虑工厂模式。也属于创建型模式。

//工厂模式
var MYAPP={};
MYAPP.dom={};
MYAPP.dom.Text=function(){
	this.insert=function(where){
		var txt=document.createTextNode(this.url);
		where.appendChild(txt);
	};
};//有三个相似的对象,三个对象中的方法一样,从而使用也一样

MYAPP.dom.Link=function(){
	this.insert=function(where){
		var link=document.createElement('a');
		link.href=this.url;
		linlk.appendChild(document.createTextNode(this.url));
		where.appendChild(link);
	};
};
MYAPP.dom.Image=function(){
	this.insert=function(where){
		var im=document.createElement('img');
		im.src=this.url;
		where.appendChild(im);
	};
};

/* var o=new MYAPP.dom.Image();
 * o.url='www.baidu.com';
 * o.insert(document.body);
 *
 * var o=new MYAPP.dom.Link();
 * o.url='www.baidu.com';
 * o.insert(document.body);
 *
 * var o=new MYAPP.dom.Text();
 * o.url='www.baidu.com';
 * o.insert(document.body);
 */
MYAPP.dom.factory=function(type){
	return new MYAPP.dom[type];
}//当构造器过多时,查找不那么一目了然,用工厂函数方法动态操作,省去了如上注释掉的操作或者if操作
var o=MYAPP.dom.factory("Image")//这种方法本质上用到了对象属性的一一对应关系
o.url='www.baidu.com';
o.insert(document.body);

  3.装饰器模式

   此种模式是一种结构型模式,主要考虑如何拓展对象的功能。可以为一个基础对象创建若干装饰器对象以拓展其功能。由我们的程序自行选择不同装饰器,并使用它们。

var tree={};
tree.decorate=function(){
	alert("make sure the tree will not fall");
}
tree.getDecorator=function(deco){
	tree[deco].prototype=this;//返回新对象并且原tree作为新对象的原型对象
	return new tree[deco];
};
tree.RedBalls=function(){//tree的redball属性也是对象
	this.decorate=function(){
		this.RedBalls.prototype.decorate();//首先调用原型对象decorate方法
		alert("put on some red ball");
	}
};

tree.BlueBalls=function(){
	this.decorate=function(){
		this.BlueBalls.prototype.decorate();//首先调用原型对象decorate方法
		alert("add blue ball");
	}
};

tree.Angel=function(){
	this.decorate=function(){
		this.Angel.prototype.decorate();//首先调用原型对象decorate方法
		alert("an angel on the top");
	}
};//以上三个装饰器可按照需要选择
tree=tree.getDecorator("BlueBalls");//返回new tree["BlueBall"],并且保留对tree作为原型对象
tree=tree.getDecorator("RedBalls");//下两个类似
tree=tree.getDecorator("Angel");
tree.decorate();//当调用最后的decorate方法时,会分别上溯调用各自decorate方法中的原型对象方法调用
//装饰器模式的实现,关键在构造新对象时不断保留原对象作为原型对象,同时新对象的方法中,不断调用原型对象的同名方法
//总的来说就是保存原有对象功能的前提下,不断添加新的功能到原有对象

4.观察者模式

   此种模式属于行为型模式,主要处理对象之间的交互通信的问题。通常包含两类对象:发行商和订阅商。

   

//观察者模式
//观察者模式分为推送和拉动两类,推送模式是由发行商负责将消息通知给各个订阅者,以下为推送模式实例
var observer={//观察这对象
	addSubscriber:function(callback){
		this.subscribers[this.subscribers.length]=callback;
	},//添加订阅者
	removeSubscriber:function(callback){
		for(var i=0;i<this.subscribers.length;i++){
			if(this.subscribers[i]===callback){
				delete(this.subscribers[i]);
			}
		}
	},//移除订阅者
	publish:function(what){
		for(var i=0; i<this.subscribers.length;i++){
			if(typeof this.subscribers[i]==='function'){
				this.subscribers[i](what);//广播信息后会传给每个订阅者
			}
		}
	},//接受并传递数据给订阅者
	make:function(o){
		for(var i in this){
			o[i]=this[i];
			o.subscribers=[];
		}
	}//将任意对象转化为发行商,并赋予以上三种方法,即获取添加、移除订阅者功能以及推送消息功能
};

var blogger={
	writeBlogPost:function(){
		var content='Today is'+new Date();
		this.publish(content);//为成为发行商广播信息做准备的步骤
	}
};
observer.make(blogger);//构造blogger为发行商

var jack={
	read:function (what){
		console.log('I just read that'+what);
	}
};//准备一个潜在订阅者
blogger.addSubscriber(jack.read);//添加订阅者,注意传送的是函数,这样在订阅者publish函数中就能调用订阅者的函数
blogger.writeBlogPost();//发布信息给订阅者
blogger.removeSubscriber(jack.read);//移除订阅者

javascript常见的设计模式举例,布布扣,bubuko.com

时间: 2024-10-19 16:35:05

javascript常见的设计模式举例的相关文章

javascript常见编程模式举例

最近买到手了一本<javascript框架设计>,详细介绍开发js框架所用到的知识.初读一点,乐帝脆弱的理论修养就暴露无遗了,所以专门加强理论修养,重看javascript编程模式的举例.下面来介绍下js中,常见的编程模式.    1.命名空间    同其他高级语言一样,js中的命名空间概念,也是为了减少命名冲突,但js没有命名空间关键字.js实现命名空间的思路是定义一个全局变量,将此命名空间的变量和方法,定义为这个全局变量的属性. var MYAPP=MYAPP||{};//全局变量 MYA

JavaEE5种常见的设计模式

1.工厂模式:比如你写了个应用,里面用到了数据库的封装,你的应用可以今后需要在不同的数据库环境下运行,可能是oracle,db2,sql server等, 那么连接数据库的代码是不一样的,你用传统的方法,就不得不进行代码修改来适应不同的环境,非常麻烦,但是如果你采用工厂类的话,将各种 可能的数据库连接全部实现在工厂类里面,通过你配置文件的修改来达到连接的是不同的数据库,那么你今后做迁移的时候代码就不用进行修改了. 2.单例模式:提供了唯一实例的受控访问,对于经常要创建和销毁的对象单例模式无疑可以

JavaScript常见技术点

今天看到一篇博客讲解了几个JavaScript的技术点,感觉很实用. 原地址:Javascript常见技术点 1.javascript面向对象中继承实现 javascript面向对象中的继承实现一般都使用到了构造函数和Prototype原型链,简单的代码如下: <span style="font-family:Microsoft YaHei; font-size:12px"> function Animal(name) { this.name = name; } Anima

一种JavaScript 类的设计模式

一种JavaScript 类的设计模式尽管前面介绍了如何定义一个类,如何初始化一个类的实例,但既可以在function定义的函数体中添加成员,又可以用prototype 定义类的成员,代码显的很混乱,和面向对象语言类的实现之间有着很大的区别.那么,如何以一种清晰的方式来定义类呢?下面给出了一种类的实现模式,并将它们对应到面向对象语言类的实现上.类的构造函数用来初始化一个实例,是每个类必不可少的一部分.在传统意义的面向对象中,类的构造函数的名称和类的名称一致,同时它们的定义方式和类成员的定义是类似

面试题-Java设计模式举例

面试题-Java设计模式举例 1.适配器模式 涉及三个角色:Target目标接口.Adaptee源角色.Adapter适配器:Adapter将源接口适配到目标接口,继承源接口,实现目标接口. Java I/O操作中很多这样的例子: InputStreamReader 将 InputStream 适配到 Reader:需要继承InputStream实现Reader. OutputStreamWriter 将 OutputStream 适配到 Writer: StringReader 将 Strin

js验证网址等Javascript常见验证代码合集

发一个利用js验证网址是否正确,email格式是否正确,是否为数字及数字的范围,密码或字符长度及是否相等及要求的最小字符串长度,输入是否为空等Javascript常见验证代码合集,用的上的朋友可以拿去了自行添加整理. 关键的JavaScript代码函数: 查看代码 打印 001 /** 002 * 数据验证框架.增加了对id字段检查出错时,直接在对应后面添加一< span>元素来显示错误信息. 003 * 004 * @author www.phpernote.com 005 * @versi

常见的设计模式:单例模式、工厂模式、观察者模式、装饰模式与适配器模式

常见的设计模式:单例模式.工厂模式.观察者模式.装饰模式与适配器模式 这里可以阅读Terry Lee的设计模式系列来理解学习一下 1.4.1 单例模式 .NET设计模式(2):单件模式(Singleton Pattern)  http://terrylee.cnblogs.com/archive/2005/12/09/293509.html 1.4.2 抽象工厂模式 .NET设计模式(3):抽象工厂模式(Abstract Factory) http://terrylee.cnblogs.com/

【javascript】javascript常见正则表达式实例

javascript常见正则表达式实例 实例来源 1 var myRegExp = { 2 // 检查字符串是否为合法QQ号码 3 isQQ: function(str) { 4 // 1 首位不能是0 ^[1-9] 5 // 2 必须是 [5, 11] 位的数字 \d{4, 9} 6 var reg = /^[1-9][0-9]{4,9}$/gim; 7 if (reg.test(str)) { 8 console.log('QQ号码格式输入正确'); 9 return true; 10 }

php中五种常见的设计模式

设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所介绍的设计模式背后的核心概念非常简单.经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板.使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物.同样的概念也适用于软件. 设计模式不仅代表着更快开发健壮