| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,5 +1,16 @@ | |||
| 1 | 1 | <h3>设计模式</h3> | |
| 2 | + 对“模式”的广义解释是“反复发生的事件或对象的固定用法...可以用来作为重复使用的模板或模型”(http://en.wikipedia.org/wiki/Pattern)。<br /> | ||
| 3 | + 在软件开发领域,模式是指常见问题的通用解决方案。模式不是简单的代码复制和粘贴,而是一种最佳实践,一种高级抽象,是解决某一类问题的范本。<br /> | ||
| 4 | + 学习这些模式非常重要,因为:<br /> | ||
| 5 | + > > 这些模式提供了经过论证的最佳实践,它可以帮助我们更好的编码,避免重复造轮子。 | ||
| 6 | + > > 这些模式提供了高一层的抽象。一个时间段内大脑只能处理一定复杂度的逻辑,因此当你处理更繁琐棘手的问题时,使用模式可以帮你理清头绪,不会被低级的琐事阻碍大脑思考, | ||
| 7 | + 因为所有的细枝末节都可以被归类和切分成不同的块(模式)。 | ||
| 8 | + 这些模式为开发者和团队提供了沟通的渠道,团队开发者之间往往是异地协作,不会有经常面对面的沟通机会。简单的代码编写技巧和技术问题处理方式的约定(代码注释) | ||
| 9 | + 可以使开发者之间的交流更加通畅。例如,说“即时函数”(immediate function)比说“你写好一个函数后,在函数的结束花括号的后面添加一对括号, | ||
| 10 | + 这样能在定义函数结束后马上执行这个函数”要更容易表达和理解。 | ||
| 11 | + <br /> | ||
| 2 | 12 | 《parctical common lisp》的作者曾说,如果你需要一种模式,那一定是哪里出了问题。他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案。<br /> | |
| 3 | 13 | 不管是弱类型或强类型,静态或动态语言,命令式或说明式语言、每种语言都有天生的优缺点。一个牙买加运动员, 在短跑甚至拳击方面有一些优势,在练瑜伽上就欠缺一些。<br /> | |
| 4 | 14 | 术士和暗影牧师很容易成为一个出色的辅助,而一个背着梅肯满地图飞的敌法就会略显尴尬。<br /> | |
| 5 | - 换到程序中, 静态语言里可能需要花很多功夫来实现装饰者,而js由于能随时往对象上面扔方法,以至于装饰者模式在js里成了鸡肋 | ||
| 15 | + <br /> | ||
| 16 | + ###反模式 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5,8 +5,7 @@ | |||
| 5 | 5 | 隆有走动,攻击,防御,跌倒,跳跃等等多种状态,而这些状态之间既有联系又互相约束。<br /> | |
| 6 | 6 | 比如跳跃的时候是不能攻击和防御的。跌倒的时候既不能攻击又不能防御,而走动的时候既可以攻击也可以跳跃。<br /> | |
| 7 | 7 | 要完成这样一系列逻辑, 常理下if else是少不了的. 而且数量无法估计, 特别是增加一种新状态的时候, 可能要从代码的第10行一直改到900行. <br /> | |
| 8 | - <pre> | ||
| 9 | - <code> | ||
| 8 | + '''javascript | ||
| 10 | 9 | if ( state === 'jump' ){ | |
| 11 | 10 | if ( currState === 'attack' || currState === 'defense' ){ | |
| 12 | 11 | return false; | |
@@ -16,11 +15,9 @@ if ( state === 'jump' ){ | |||
| 16 | 15 | return true; | |
| 17 | 16 | } | |
| 18 | 17 | } | |
| 19 | - </code> | ||
| 20 | - </pre> | ||
| 18 | + ``` | ||
| 21 | 19 | 为了消灭这些if else, 并且方便修改和维护, 我们引入一个状态类. | |
| 22 | - <pre> | ||
| 23 | - <code> | ||
| 20 | + ```javascript | ||
| 24 | 21 | var StateManager = function(){ | |
| 25 | 22 | var currState = 'wait'; | |
| 26 | 23 | var states = { | |
@@ -49,5 +46,4 @@ var StateManager = function(){ | |||
| 49 | 46 | } | |
| 50 | 47 | var stateManager = StateManager(); | |
| 51 | 48 | stateManager.changeState( 'defense' ); | |
| 52 | - </code> | ||
| 53 | - </pre> | ||
| 49 | + ``` | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -23,10 +23,10 @@ PS2-to-USB适配器就是一个例子。<br /> | |||
| 23 | 23 | 添加适配器 | |
| 24 | 24 | </a> | |
| 25 | 25 | <br /> | |
| 26 | - 1.1、适配器模式的适用场合:<br /> | ||
| 26 | + ###1.1、适配器模式的适用场合:<br /> | ||
| 27 | 27 | 适配器适用于客户系统期待的接口与现有API提供的接口不兼容这种场合。适配器所适配的两个方法执行的应该是类似的任务,否则的话就解决不了问题。就像桥接元素和外观元素一样,通过创建适配器,可以把抽象与其实现隔离开来,以便二者独立变化。<br /> | |
| 28 | - 1.2、适配器模式之利:<br /> | ||
| 28 | + ###1.2、适配器模式之利:<br /> | ||
| 29 | 29 | 用一个新的接口对现有类的接口进行包装,这样客户程序就能使用这个并非为其量身打造的类而又无需为此大动手术。<br /> | |
| 30 | - 1.3、设配器模式之弊:<br /> | ||
| 30 | + ###1.3、设配器模式之弊:<br /> | ||
| 31 | 31 | 有人认为适配器是一种不必要的开销,完全可以通过重写现有代码避免。此外适配器模式也会引入一批需要支持的新工具。如果现有API还未定形,或者新接口还未定形,那么适配器可能不会一直管用。<br /> | |
| 32 | 32 | 在涉及大型系统和遗留框架的情况下,它的优点往往比缺点更突出。 | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -106,8 +106,10 @@ Observer-Pattern | |||
| 106 | 106 | <h3 name="html5">HTML5<h5> | |
| 107 | 107 | <h3 name="NodeJs">Node.js</h3> | |
| 108 | 108 | ------------------------ | |
| 109 | - | ||
| 109 | + 工具 | ||
| 110 | + <a href="http://mahua.jser.me/">jser</a> | ||
| 110 | 111 | 参考资料 | |
| 111 | - <a href="http://www.apress.com/" name="referenceData">http://www.apress.com/</a> | ||
| 112 | + <a href="http://www.apress.com/" name="referenceData">http://www.apress.com/</a> <br /> | ||
| 113 | + <a href="http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/">Learning JavaScript Design Patterns</a> <br /> | ||
| 112 | 114 | <a href="http://www.alloyteam.com">alloyteam</a> | |
| 113 | 115 | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments