SlideShare ist ein Scribd-Unternehmen logo
1 von 33
小谈Javascript设计模式 鲁超伍|Adam http://adamlu.com/ http://twitter.com/adamlu
为什么要使用设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
设计模式(Design Patterns) 工厂(Factory)模式 单体(Singleton)模式 装饰者(Decorator)模式 桥接(Bridge)模式 适配器(Adapter)模式 观察者(Observer)模式 门面(Façade)模式 策略(Strategy)模式 命令(Command)模式 职责链(Chain Of Responsibility)模式 组合(Composite)模式 享元(Flyweight)模式 ……
工厂(Factory)模式 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
Factory-EXP if (typeofXMLHttpRequest != "undefined") {    return new XMLHttpRequest();} else if (typeofwindow.ActiveXObject != "undefined") {    return new ActiveXObject("MSXML2.XMLHttp");} function XMLHttpFactory() {}XMLHttpFactory.createXMLHttp = function () {    if (typeofXMLHttpRequest != "undefined") {        return new XMLHttpRequest();    } else if (typeofwindow.ActiveXObject != "undefined") {        return new ActiveXObject("MSXML2.XMLHttp");    }}  varxmlhttp=XMLHttpFactory.createXMLHttp();
单体(Singleton)模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Singleton-EXP UserAgent = function UserAgent() {  var u = navigator.userAgent, d = document;     this.ie = typeofd.all != "undefined";     this.ns4 = typeofd.layers != "undefined"; this.dom = typeofd.getElementById != "undefined"; this.safari = /Safari/.test(u); this.moz = /Gecko/.test(u) && !this.safari; this.mie = this.ie && /Mac/.test(u);     this.win9x = /Win9/.test(u) || /Windows 9/.test(u);     this.o7 = /Opera 7/.test(u); this.supported = (typeofd.write != "undefined")                       && (this.ie || this.ns4 || this.dom); };
Singleton-EXP ua = new function UserAgent() { var u = navigator.userAgent, d = document;     this.ie = typeofd.all != "undefined";     this.ns4 = typeofd.layers != "undefined"; this.dom = typeofd.getElementById != "undefined"; this.safari = /Safari/.test(u); this.moz = /Gecko/.test(u) && !this.safari; this.mie = this.ie && /Mac/.test(u);     this.win9x = /Win9/.test(u) || /Windows 9/.test(u);     this.o7 = /Opera 7/.test(u); this.supported = (typeofd.write != "undefined")                       && (this.ie || this.ns4 || this.dom); };
装饰者(Decorator)模式 动态地给一个对象添加一些额外的职责。就扩展功能而言, 它比生成子类方式更为灵活。
Decorator-EXP // Create a Name Space  myText = { };   myText.Decorators = { };  // Core base class    myText.Core = function( myString ) { this.show = function( ) {   return myString;      };   }   // First Decorator, to add quesCon mark to string   myText.Decorators.addQuestionMark = function ( myString ) { this.show = function( ){   return myString.show( ) + '?'; };     }   //Second Decorator, to make string Italics   myText.Decorators.makeItalic = functioon( myString ) { this.show = function(){   return "<i>" + myString.show( ) + "</i>";      };   }
Decorator-EXP //Third Decorator, to make first character of sentence caps  myText.Decorators.upperCaseFirstChar = function( myString ) { this.show = function( ){  varstr = myString.show( );  varucf = str.charAt(0).toUpperCase( ); return ucf + str.substr( 1, str.length – 1 );     };  }   // Set up the core String    vartheString = new myText.Core( “this is a sample test string” );   // Decorate the string with Decorators   theString = new myText.Decorator.upperCaseFirstChar( theString );   theString = new myText.Decorator.addQuestionMark( theString );   theString = new myText.Decorator.makeItalic( theString );    theString.show();
桥接(Bridge)模式 将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Bridge-EXP addEvent(element, 'click', getBeerById); function getBeerById(e) { var id = this.id; asyncRequest('GET', 'beer.uri?id=' + id, function(resp) { // Callback response. console.log('Requested Beer: ' + resp.responseText); }); }
Bridge-EXP function getBeerById(id, callback) { // Make request for beer by ID, then return the beer data. asyncRequest('GET', 'beer.uri?id=' + id, function(resp) { // callback response callback(resp.responseText); }); } addEvent(element, 'click', getBeerByIdBridge); function getBeerByIdBridge (e) { getBeerById(this.id, function(beer) { console.log('Requested Beer: '+beer); }); }
适配器(Adapter)模式 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Adapter-EXP function $(){}; function YAHOO.util.Dom.get=function(el){}; function prototypeToYuiAdapter(){      return YAHOO.util.Dom.get(arguments);    } function YUIToPrototypeAdapter(el) { return $.apply(window, el); } $ = prototypeToYuiAdapter; YAHOO.util.Dom.get = YUIToPrototypeAdapter;
观察者(Observer)模式 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Observer-EXP // The Observer Object – One who super sees all the print operations  function printManager( ) {  var queue = [ ];  // The attach method  this.addJob = function(name, job) { queue.push( { ”name” : name, "job” : job } );  }  // The detach method  this.removeJob = function(job) {  var _queue = [ ];  for(var i in queue) {  if(queue[ i ].job == job) continue; else _queue.push( queue[ i ] );  }  queue = _queue;  }  // The notify method  this.doPrint = function( item ) {  for ( var i in queue ) { queue[ i ].job.call( this, item );}}  }
Observer-EXP var p = new printManager(); // Publishers are in charge of "publishing”  function printWithItalics( str ) { // The callback function – the print job  alert( “<i>” + str + “</i>” );  }  //Once subscribers are notified their callback functions are invoked p.addJob( "italics", printWithItalics);  // Notify the observer about a state change  p.doPrint("this is a test");
门面(Facade)模式 子系统中的一组接口提供一个一致的界面, 门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Facade-EXP function IEBrowser()  {this.hello=function(){alert(”IE browser”);}}function NonIEBrowser()  (this.hello =function(){alert(“NonIE browser”);}}var Facade={};Facade.hello=function(){var browser;if(window.ActiveXObject)  browser=new IEBrowser();else browser=new NonIEBrowser();Browser.hello(););
策略(Strategy)模式 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
Strategy-EXP var Button = function(submit_func, label) { this.label = label;  	return {  on_submit : function(numbers) {  			return submit_func(numbers); 		}  	}; }; var numbers = [1,2,3,4,5,6,7,8,9];
Strategy-EXP var sum = function(n) {  var sum = 0;  	for ( var a in n ) {  		sum = sum + n[a];  	}  	return sum; };  var a = new Button(sum, "Add numbers"); var b = new Button(function(numbers) {  			return numbers.join(',');  		}, "test2"); a.on_submit(numbers); b.on_submit(numbers);
命令(Command)模式 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Command-EXP var Calculator={ // addition add: function(x,y) { return x+y; }, // subtraction substract: function(x, y) { return x-y; }, // multiplication multiply: function(x, y) { return x*y; }, // division divide: function(x, y) { return x/y; }, };
Command-EXP Calculator.calc=function(command)  { return Calculator[command.type](command.opl,command.op2); }; Calculator.calc({type: "add",opl:1,op2:1}); Calculator.calc({type: "Substract",opl:6,op2:2}); Calculator.calc({type: "multiply",opl:5,op2:2)); Calculator.calc({type: "divide",opl:8,op2:4));
职责链(Chain Of Responsibility)模式 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
组合(Composite)模式 将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
享元(Flyweight)模式 运用共享技术有效地支持大量细粒度的对象。
总结 设计模式不是哪种编程语言特有的,它同样可以应用于Javascrip,各种设计模式建立在面向对象编程的基础上,而设计模式应用于前端也是在最近几年,只有通过连续不断的软件开发实践我们才能够灵活的运用设计模式。
参考资源 http://www.www.digital-web.com/articles/excerpt_pro_javascript_patterns http://aspalliance.com/1782_Working_with_GoFs_Design_Patterns_in_JavaScript_Programming.7 http://michaux.ca/articles/the-command-pattern-in-javascript-encapsulating-function-property-calls http://en.wikipedia.org/wiki/Strategy_pattern#JavaScript http://baike.baidu.com/view/66964.htm http://www.slideshare.net/rmsguhan/javascript-design-patterns
谢谢!

Weitere ähnliche Inhalte

Was ist angesagt?

Ian 20151002 es2015
Ian 20151002 es2015Ian 20151002 es2015
Ian 20151002 es2015LearningTech
 
Swift编程语言入门教程 中文版
Swift编程语言入门教程 中文版Swift编程语言入门教程 中文版
Swift编程语言入门教程 中文版Harvey Zhang
 
组件交互模式的非主流研究
组件交互模式的非主流研究组件交互模式的非主流研究
组件交互模式的非主流研究youalab
 
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHPPHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHPLi-Wei Lu
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code cleanmacrochen
 
C++中级培训胶片
C++中级培训胶片C++中级培训胶片
C++中级培训胶片ff1
 
Javascript Training
Javascript TrainingJavascript Training
Javascript Trainingbeijing.josh
 
改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法crasysatan
 
twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹twMVC
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1Sheng-Han Su
 
Sql语句大全大全(经典珍藏版)
Sql语句大全大全(经典珍藏版)Sql语句大全大全(经典珍藏版)
Sql语句大全大全(经典珍藏版)totaleather2009
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Derek Lee
 

Was ist angesagt? (20)

Ian 20151002 es2015
Ian 20151002 es2015Ian 20151002 es2015
Ian 20151002 es2015
 
Swift编程语言入门教程 中文版
Swift编程语言入门教程 中文版Swift编程语言入门教程 中文版
Swift编程语言入门教程 中文版
 
组件交互模式的非主流研究
组件交互模式的非主流研究组件交互模式的非主流研究
组件交互模式的非主流研究
 
Ch10
Ch10Ch10
Ch10
 
Ch10 範例
Ch10 範例Ch10 範例
Ch10 範例
 
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHPPHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
PHP 初階課程 Part. 3 - Functions and brief intro to Object-Oriented PHP
 
Keep your code clean
Keep your code cleanKeep your code clean
Keep your code clean
 
Ch08
Ch08Ch08
Ch08
 
C++中级培训胶片
C++中级培训胶片C++中级培训胶片
C++中级培训胶片
 
Ch9
Ch9Ch9
Ch9
 
Javascript Training
Javascript TrainingJavascript Training
Javascript Training
 
Ch07
Ch07Ch07
Ch07
 
Appendix B 範例
Appendix B 範例Appendix B 範例
Appendix B 範例
 
改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法改善程序设计技术的50个有效做法
改善程序设计技术的50个有效做法
 
twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹twMVC#27 | C# 7.0 新功能介紹
twMVC#27 | C# 7.0 新功能介紹
 
JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1JavaScript 快速複習 2017Q1
JavaScript 快速複習 2017Q1
 
Op 20090411
Op 20090411Op 20090411
Op 20090411
 
Sql语句大全大全(经典珍藏版)
Sql语句大全大全(经典珍藏版)Sql语句大全大全(经典珍藏版)
Sql语句大全大全(经典珍藏版)
 
I os 02
I os 02I os 02
I os 02
 
Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18Python入門:5大概念初心者必備 2021/11/18
Python入門:5大概念初心者必備 2021/11/18
 

Ähnlich wie 小谈Javascript设计模式

Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训lotusprince
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记yiditushe
 
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 升煌 黃
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构裕波 周
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验QLeelulu
 
Javascript模板引擎
Javascript模板引擎Javascript模板引擎
Javascript模板引擎Jerry Xie
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Javascript 性能优化总结.docx
Javascript 性能优化总结.docxJavascript 性能优化总结.docx
Javascript 性能优化总结.docxbaixingfa
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)Chris Huang
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
Java script closures
Java script closuresJava script closures
Java script closuresskywalker1114
 
YUI ─ 阿大
YUI ─ 阿大YUI ─ 阿大
YUI ─ 阿大taobao.com
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skillfirestoke
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术hoopchina
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档yiditushe
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现hua qiu
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门Lucien Li
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门Lucien Li
 

Ähnlich wie 小谈Javascript设计模式 (20)

Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训
 
Ejb工作原理学习笔记
Ejb工作原理学习笔记Ejb工作原理学习笔记
Ejb工作原理学习笔记
 
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端 用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
用 Standalone Component 來寫 Angular 吧! - STUDY4.TW 2023 小聚 - 聊前端
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
Javascript模板引擎
Javascript模板引擎Javascript模板引擎
Javascript模板引擎
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Javascript 性能优化总结.docx
Javascript 性能优化总结.docxJavascript 性能优化总结.docx
Javascript 性能优化总结.docx
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
 
Java script closures
Java script closuresJava script closures
Java script closures
 
Java script closures
Java script closuresJava script closures
Java script closures
 
YUI ─ 阿大
YUI ─ 阿大YUI ─ 阿大
YUI ─ 阿大
 
JavaScript Advanced Skill
JavaScript Advanced SkillJavaScript Advanced Skill
JavaScript Advanced Skill
 
PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术PHPUnit + Xdebug 单元测试技术
PHPUnit + Xdebug 单元测试技术
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
旺铺前端设计和实现
旺铺前端设计和实现旺铺前端设计和实现
旺铺前端设计和实现
 
Ken20150313
Ken20150313Ken20150313
Ken20150313
 
iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门iPhone,ios,Object-c基础入门
iPhone,ios,Object-c基础入门
 
iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门iPhone,ios,Object-C基础入门
iPhone,ios,Object-C基础入门
 

Mehr von Adam Lu

Yui rocks
Yui rocksYui rocks
Yui rocksAdam Lu
 
YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用Adam Lu
 
一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps一步一步开发Html5 mobile apps
一步一步开发Html5 mobile appsAdam Lu
 
HTML5概览
HTML5概览HTML5概览
HTML5概览Adam Lu
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUIAdam Lu
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on MobileAdam Lu
 
Html5 on Mobile(For Developer)
Html5 on Mobile(For Developer)Html5 on Mobile(For Developer)
Html5 on Mobile(For Developer)Adam Lu
 
HTML5 on Mobile(For Designer)
HTML5 on Mobile(For Designer)HTML5 on Mobile(For Designer)
HTML5 on Mobile(For Designer)Adam Lu
 
重新认识Html5
重新认识Html5重新认识Html5
重新认识Html5Adam Lu
 
常用Js框架比较
常用Js框架比较常用Js框架比较
常用Js框架比较Adam Lu
 
浏览器兼容性问题小结
浏览器兼容性问题小结浏览器兼容性问题小结
浏览器兼容性问题小结Adam Lu
 
从Adobe和qcof会议看前端开发
从Adobe和qcof会议看前端开发从Adobe和qcof会议看前端开发
从Adobe和qcof会议看前端开发Adam Lu
 
揭秘Html5和Css3
揭秘Html5和Css3揭秘Html5和Css3
揭秘Html5和Css3Adam Lu
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web PerformanceAdam Lu
 

Mehr von Adam Lu (14)

Yui rocks
Yui rocksYui rocks
Yui rocks
 
YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用YUI介绍和使用YUI构建web应用
YUI介绍和使用YUI构建web应用
 
一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps
 
HTML5概览
HTML5概览HTML5概览
HTML5概览
 
Get started with YUI
Get started with YUIGet started with YUI
Get started with YUI
 
HTML5 on Mobile
HTML5 on MobileHTML5 on Mobile
HTML5 on Mobile
 
Html5 on Mobile(For Developer)
Html5 on Mobile(For Developer)Html5 on Mobile(For Developer)
Html5 on Mobile(For Developer)
 
HTML5 on Mobile(For Designer)
HTML5 on Mobile(For Designer)HTML5 on Mobile(For Designer)
HTML5 on Mobile(For Designer)
 
重新认识Html5
重新认识Html5重新认识Html5
重新认识Html5
 
常用Js框架比较
常用Js框架比较常用Js框架比较
常用Js框架比较
 
浏览器兼容性问题小结
浏览器兼容性问题小结浏览器兼容性问题小结
浏览器兼容性问题小结
 
从Adobe和qcof会议看前端开发
从Adobe和qcof会议看前端开发从Adobe和qcof会议看前端开发
从Adobe和qcof会议看前端开发
 
揭秘Html5和Css3
揭秘Html5和Css3揭秘Html5和Css3
揭秘Html5和Css3
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web Performance
 

小谈Javascript设计模式