javascript设计模式(一)单例模式 策略模式

来源:互联网 发布:gson解析对象数组 编辑:程序博客网 时间:2024/05/18 02:01

单例模式的定义是指保证一个类仅有一个实例,并且提供一个访问它的全局访问点,其核心很简单就两点,唯一实例和提供全局访问,

唯一实例一般都是对当前是否已经创建一个实例进行判断,至于全局访问那就是作用域的问题了,只要注意全局变量污染的问题就好,很多时候我们都是采用了闭包的形式,下面举一个简单例子

<span style="font-size:18px;">//保证只有一个实例并且在需要的时候才创建var getSingle = function(fn){var ret;return function(){return ret || ( ret = fn().apply( this, arguments ));};};//传入一个简单的单例函数的参数试验var getDiv = getSingle( function(){return document.createElement( "div" );});var div1 = getDiv();var div2 = getDiv();alert(div1 === div2);//true</span>

上面的单例模式是采用了闭包加高阶函数的形式,实际的运用中是非常灵活的,不必拘泥于形式,只要注意唯一实例(判断)和提供全局访问(作用域)就好,另外还要注意管理单例和对单例进行创建、添加方法等一系列行为的职责分散,遵从封闭-开放原则。


策略模式的定义是:定义一系列算法,把他们一个个封装起来,并且使他们可以相互替换,也就是说各个策略类都是平行的,其实直白点就是把原本判断应该走那条分支、进行哪个方法的if 、switch语句封装成了一个个策略类实现更好的封闭-开放原则,以便将来复用修改都非常方便,想增加一个策略类就先定义好,然后再添加到策略列表里就好了,不多说了,先放一个简单的奖金发放策略例子

<span style="font-size:18px;">var strategies = {//策略列表    "S": function( salary ){        return salary * 4;    },    "A": function( salary ){        return salary * 3;    },    "B": function( salary ){        return salary * 2;    }};var calculateBonus = function( level, salary ){//委托给策略列表里策略    return strategies[ level ]( salary );};console.log( calculateBonus( "S", 20000) );//80000console.log( calculateBonus( "A", 10000) );//30000</span>

上面的策略模式小例子,策略列表只是提供策略存放,客户真正调用的是calculateBonus,而calculateBonus又将请求委托给了策略列表中的策略,二者职责分离,非常易于理解、复用、扩展,支持封闭-开放原则,但是策略模式也会在程序里封装出许多策略类或者策略对象,最重要的如果客户需要使用这些策略,那么首先客户必须要对这些策略有很大程度了解,而策略对象就需要对客户暴露出许多内部实现细节,这极大违反了最少知识原则。


简单的介绍了一下js里面很常用也很简单的两种设计模式,由于js的许多便利的特性,他们实现起来比较简单,甚至我们很多时候都是在不经意的使用它们,但是系统了解一下他们的实现过程以及一些原理还是对我们实际开发、加深对设计模式原则的理解和编写出优雅的代码有极大好处的,至少应用了这两种设计模式后,if语句的使用频率好像没那么高了~


0 0
原创粉丝点击