理解JavaScript中的设计模式_0

简介:可靠的设计模式是可维护软件的基石,如果你曾参与技术面试,很有可能被问到关于设计模式的这类东西。下面这个指南中,我们将学习一些今天就可以用得着的设计模式。

什么是设计模式?

简单来说,设计模式就是对特定类型问题重用的软件解决方案,这些问题在软件开发的时候经常会碰到,通过很多年的实践,专家对一些相似地问题总结出一些方法,这些方法就封装成为一种设计模式,所以:

模式是一种经验证的用于解决软件开发问题的方案。

模式是可扩展的,因为他们经常被结构化而且你需要遵循某些规则。

对于相似的问题,模式可被重用

在接下来的教程中,我们将直接给出一些设计模式的例子。

设计模式的种类

软件开发中,设计模式通常分为几种类别,在这篇教程中我们重点介绍以下三种:

1、创建型模式专注于构建对象或者类,对象的创建听起来很简单(在某些情况下),但是大型应用需要控制对象的创建过程。

2、结构型设计模式专注于管理对象之间的关系使得应用是用一种可扩展的架,,结构型模式关键点是确保在应用程序中部分改变不会影响其他部分。

3、行为模式专注于对象间的通信

你可能在读完这些简介的描述后仍然觉得有问题,这很正常,一旦我们看完了这些模式的深入介绍后,问题也会变得明朗起来,所以接着往下看吧。

类在JavaScript中的注意点:

当我们读设计模式时,你经常会提及到类和对象。这很疑惑,因为JavaScript没有真正“类”的构造,一个更合适的术语叫“数据类型”。

JavaScript中的数据类型:

JavaScript是一门面向对象的语言,一个对象继承自其他对象,这个概念以原型继承著称。一个数据类型可以通过构造函数创建,就像:

 
  1. functionPerson(config){
  2. this.name=config.name;
  3. this.age=config.age;
  4. }
  5. Person.prototype.getAge=function(){
  6. returnthis.age;
  7. };
  8. vartilo=newPerson({name:"Tilo",age:23});
  9. console.log(tilo.getAge());

当方法定义在Person数据类型中时注意prototype的使用,由于多个Person对象将引用同一个prototype,这样就允许 getAge()方法可以被所有的Person数据类型的实例共享。而不是每个实例都重新定义一次,除此之外,任何继承自Person的数据类型都可以访问getAge()方法。

处理私有数据

在JavaScript中另一个常见的问题是没有真正意义上的私有变量,然而我们可以使用闭包

去模拟私有变量,考虑下面这代码片段:

 
  1. varretinaMacbook=(function(){
  2. //Privatevariables
  3. varRAM,addRAM;
  4. RAM=4;
  5. //Privatemethod
  6. addRAM=function(additionalRAM){
  7. RAM+=additionalRAM;
  8. };
  9. return{
  10. //Publicvariablesandmethods
  11. USB:undefined,
  12. insertUSB:function(device){
  13. this.USB=device;
  14. },
  15. removeUSB:足球平台出租"keyword">function(){
  16. vardevice=this.USB;
  17. this.USB=undefined;
  18. returndevice;
  19. }
  20. };
  21. })();

在上面这个例子中,我们创建了一个retinaMacbook对象,含有公有和私有变量及方法,可以这样来使用它:

 
  1. retinaMacbook.insertUSB("myUSB");
  2. console.log(retinaMacbook.USB);//logsout"myUSB"
  3. console.log(retinaMacbook.RAM)//logsoutundefined

在JavaScript中函数和闭包可以做更多的事,但是我们在这个教程中没法涉及到方方面面,我们简短的学习了JavaScript的数据类型和私有变量。现在我们可以学习设计模式了。

创建型设计模式:

有很多种不同的创建设计模式,但是在这里我们主要讨论两种,建造模式(Builder)和原型模式(Prototype)。

建造模式:

建造模式通常用于web开发,有时你在使用它你却还没意识到。简而言之,这个模式可以定义如下:

“使用建造模式允许我们仅仅通过指定类型和内容来构造一个对象,我们不需要明确的创建对象。”

例如,你可能无数次的使用jQuery:

 
  1. varmyDiv=$('<divid="myDiv">Thisisadiv.</div>');
  2. //myDivnowrepresentsajQueryobjectreferencingaDOMnode.
  3. varsomeText=$('<p/>');
  4. //someTextisajQueryobjectreferencinganHTMLParagraphElement
  5. varinput=$('<input/>');

看看上面这三个例子,第一个,传递了一个<div/>元素附带一些内容,第二个,传递一个空的<p>标签,第三个,传递一个<input/>元素。这三个例子的结果都是一样的:返回一个jQuery对象的引用指向一个DOM节点。

在jQuery中$变量采用的就是建造模式,例如:返回的jQuery Dom对象可以访问由jQuery库提供的所有方法,但是并没有显示的调用document.createElement,JS 库通常都是通过这种高级方法处理的。

想象有多少工作要做,如果我们显示创建DOM元素然后插入内容到里面。通过利用建造模式,我们可以专注于对象的类型和内容,而不是显示的去创建。

原型模式

之前,我们讨论了在JavaScript中通过函数和添加方法到对象的原型中定义一个数据类型。原型模式通过原型允许对象继承自其它对象。

“原型模式是一个基于已经存在的模板对象克隆出新对象的模式”

在JavaScript中这是一种简单自然的方式来实现继承。例如:

 
  1. varPerson={
  2. numFeet:2,
  3. numHeads:1,
  4. numHands:2
  5. };
  6. //Object.createtakesitsfirstargumentandappliesittotheprototypeofyournewobject.
  7. vartilo=Object.create(Person);
  8. console.log(tilo.numHeads);//outputs1
  9. tilo.numHeads=2;
  10. console.log(tilo.numHeads)//outputs2

属性(方法)在Person对象中应用到了tilo对象的原型,我们可以重新定义在tilo对象中的属性,如果我们想要它不一样的话。上面例子中,我们使用Object.create(),然而,IE8中不支持这个比较新的方法,在这种情况下,我们可以模拟他的行为:

 
  1. varvehiclePrototype={
  2. init:function(carModel){
  3. this.model=carModel;
  4. 足球平台出租s="alt">},
  5. getModel:function(){
  6. console.log("Themodelofthisvehicleis"+this.model);
  7. }
  8. };
  9. functionvehicle(model){
  10. functionF(){};
  11. F.prototype=vehiclePrototype;
  12. varf=newF();
  13. f.init(model);
  14. returnf;
  15. }
  16. varcar=vehicle("FordEscort");
  17. car.getModel();

唯一不好的地方就是这个方法你没法指定为可读的属性,而使用Object.create()时可以指定。不管怎样,原型模式展示了对象如何继承自其它对象。

结构化模式:

结构化设计模式在当你想理解一个系统如果工作的时候显得非常有帮助。它能使应用扩展方便,维护方便。我们将讨论以下两种模式:组合模式和门面模式

组合模式:

组合模式可以理解为一个对象的组合可以像单个对象一样以一致的方式处理。这是什么意思呢?好吧,考虑下面这个例子:

 
  1. $('.myList').addClass('selected');
  2. $('#myItem').addClass('selected');
  3. //dontdothisonlargetables,it'sjustanexample.
  4. $("#dataTabletbodytr").on("click",function(event){
  5. alert($(this).text());
  6. });
  7. $('#myButton').on("click",function(event){
  8. alert("Clicked.");
  9. });

很多JavaScript库提供了一致的API,不论是处理单个DOM元素还是一个DOM元素的数组。我们可以添加selected 类给所有含.myList的选择器的元素。同样我们可以使用相同的方法处理相似的DOM元素#myItem,类似的,我们可以使用on()方法附上事件处理器在多个节点或单个节点上。

门面模式:

隐藏内部复杂结构,提供给用户简单接口使用。

门面模式几乎总是可以改善大部分软件的可用性。使用jQuery作为例子,一个最受欢迎的方法ready():

 
  1. $(document).ready(function(){
  2. //allyourcodegoeshere...
  3. });

ready()方法就实现的门面模式,如果你去查看源代码,你将发现:

 
  1. ready:(function(){
  2. ...
  3. //Mozilla,Opera,andWebkit
  4. if(document.addEventListener){
  5. document.addEventListener("DOMContentLoaded",idempotent_fn,false);
  6. ...
  7. }
  8. //IEeventmodel
  9. elseif(document.attachEvent){
  10. //ensurefiringbeforeonload;maybelatebutsafealsoforiframes
  11. document.attachEvent("onreadystatechange",idempotent_fn);
  12. //Afallbacktowindow.onload,thatwillalwayswork
  13. window.attachEvent("onload",idempotent_fn);
  14. ...
  15. }
  16. })

ready()方法并不简单,jQuery规范游览器的一致性确保ready()在合适的时间被触发。然而,作为一名开发者,你应该用简单的接口展示出来。

总结:设计模式最让人鼓舞的是有人在过去已经成功实践了。很多开源代码实现了各种JavaScript中的是设计模式。作为程序员,我们需要意识到每种设计模式的应用场景。我希望这篇教程能帮助一步步回答这些问题。

英文原文:Tilo Mitra

译文链接:http://blog.jobbole.com/25537/

您可能感兴趣的文章:
专家推荐 基础JS特效代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的高校科研信息管理系统实现了操作日志管理、字典管理、反馈管理、公告管理、科研成果管理、科研项目管理、通知管理、学术活动管理、学院部门管理、科研人员管理、管理员管理等功能。系统用到了关系型数据库王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让高校科研信息管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值