1、模板方法模式

模板方法就是将多个模型抽象化归一,从中取出一个最基本的模板,当然这个模板可以作为实体对象也可以作为抽象对象,看你具体需求,其他模块只需要继承这个模块方法,也可以扩展这个方法。

举例子:1、蛋糕的外形都是相同的,都是采用蛋糕模具做出来的,之所以商店里的蛋糕看上去形态各异,其实都是在这基础上的二次加工,所以我们添加了不同的材料。

2、例如不同的提示框,基本框架是一个提示框,但是标题提示框多了一个标题,取消提示框多了一个取消按钮等等。

模板方法的核心在于对方法的重用,它将和新方法封装在基类中,让子类继承基类的方法,实现基类方法的共享,达到方法共用。

2、观察者模式

观察者模式:又被称作发布-订阅者模式或消息机制,定义了一种依赖关系,解决了主体对象与观察者之间功能的耦合。

var Observer=(function(){
//防止消息队列爆满而被篡改故将消息容器作为静态私有变量保存
var _messages={};
return {
//注册信息接口,是将订阅者注册的消息推入到消息对列中
regist:function(type,fn){
if(typeof _messages[type]==='undefined'){
_messages[type]=[fn];
}else{
//将动作方法推入该消息对应的动作执行序列中
_messages[type].push(fn);
}
},
//发布消息接口
fire:function(type,args){
//如果消息没有被注册,则返回
if(!_messages[type])
return;
var events={
type:type,
args:args||{}
},
i=0,
len=_messages[type].length;
for(;i<len;i++){
//依次执行注册的消息对应动作序列
_messages[type][i].call(this,events);
}
},
//移除消息接口
remove:function(type,fn){
if(_messages[type] instanceof Array){
var i=_messages[type].length-1;
for(;i>=0;i--){
//如果存在该动作,则移除该动作
_messages[type][i]===fn && _messages[type].splice(i,1);
}
}
}
}
})();

既然选择用观察者模式来解决问题,首先应该分析哪些模块应该注册消息,哪些模块应该发布消息,这一点是很重要的。

 3、状态模式

状态模式:当一个对象的内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象。

举例子:比如我们投票,已经确定有好几种状态,如果我们采用if,else,这样要多次判断,效率低,也不方便管理。这是后我们可以将不同的判断结果封装在转态对象内,,然后该状态对象返回一个可被调用的接口方法,用于调用状态内部某种方法。

        var Result=function(){
//判断结果保存在内部状态中
var States={
//每种状态作为一种独立的方法保存
state0:function(){},
state1:function(){},
state1:function(){}
}
//获取某一种状态并执行其对应的方法
function show(result){
States["state"+result] && States["state"+result]();
}
return {
//返回调用转态方法接口
show:show
} }();

还有一个经典的例子就是我们经常玩的游戏,就是超级玛丽。玛丽要跳跃,又要开枪,奔跑等,我们总不能用if else来做判断,无形中增加的成本是无法想象的。

var MarryState=function(){
//判断结果保存在内部状态中
var States={
//每种状态作为一种独立的方法保存
move:function(){},
jump:function(){},
shoot:function(){}
}
}; var Action={
changeState:function(){
//组合通过传递多个参数进行实现
var arg=arguments;
//重置内部状态
_currentState={};
//如果有动作则添加动作
if(arg.length){
//遍历动作
for(var i=0,len=arg.length;i<len;i++){
//向内部状态中添加动作
_currentState[arg[i]]=true;
}
}
//方便链式调用
return this;
},
goes:function{
//遍历内部保存的动作
for(var i in _currentState){
//动作存在则执行
States[i]&&States[i]();
}
return this;
}
return {
//返回调用转态方法接口
change:Action.change,
goes:Action.goes
}
};
//创建一个实例
var marry=new MarryState();
marry
.change("jump","shoot")
.goes()
.goes()
.change("shoot")
.goes();

4、策略模式

策略模式:将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定的独立性,不会随客户端变化。

举例子:例如你作为商家,要在不同的节日给你商品以不同的折扣形式出售,你会怎么做?采用状态模式?no,状态模式是针对一个对象的而言的,也就是不同的商品你都要写一遍不同的状态。

对于一种商品的促销策略只用一种情况,而不需要其他促销策略,采用策略模式更为合理。

相同点:结构上,与状态模式很像,也是内部封装一个对象,然后通过返回的接口实现对内部对象的调用;

不同点:策略模式不需要管理状态,状态之间没有依赖关系、策略之间可以相互替换、在策略对象内部保存的是相互独立的一些算法。

            var PriceState=function(){
//内部算法对象
var States={
return30:function(price){},
return50:function(price){},
pecent80:function(price){},
pecent60:function(price){}
}
//策略算法调用接口
return function(algorithm,price){
//如果算法存在,则调用算法
return States[algorithm]&&States[algorithm](price)
}
};

类似的,表单验证也可以写成类似的形式:

var InputState=function(){
//内部算法对象
var States={
notNull:function(value){},
number:function(value){},
phone:function(value){},
}
//策略算法调用接口
return {
check:function(type,value){
value=value.replace(/^\s+|\s+$/g,"");
return States[type]&&States[type](value);
},
addState:function(type,fn){
States[type]=fn;
}
}
};

但最后我们增加了一个为策略对象增加策略算法的接口,这样我们如果有新的策略对象,只需要通过addState方法即可实现添加,而不用修改内部的代码。

5、职责链模式;6、命令模式

(具体看书)

7、访问者模式

访问者模式:针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法。也就是在不改变操作对象的同时,为他添加新的操作方法,来实现对操作对象的访问。

举例子:其实我们可以给对象添加数组的操作方法:比如pop,push。

js设计模式总结3的更多相关文章

  1. JS设计模式(一)

    刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ...

  2. js设计模式(12)---职责链模式

    0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ...

  3. JS设计模式——5.单体模式

    JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html   单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ...

  4. js 设计模式-接口

    js模拟java接口检测函数:确保子类实现接口中的方法:(出自js设计模式) 上代码: <script type="text/javascript" > <%-- ...

  5. 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发

    一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ...

  6. [js]js设计模式小结

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...

  7. [js]设计模式小结&对原型的修改

    js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ...

  8. js设计模式总结1

    js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ...

  9. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  10. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

随机推荐

  1. 用命令行上传本地代码到GitHub

    有两种方式上传,ssh和https,ssh老是报错=.=我用的是https 先下载git   https://git-scm.com/downloads 在代码的文件夹的同级目录中邮件打开git ba ...

  2. AngularJS $eval $parse

    $eval $parse都可以解析或计算Angular表达式的值. 一.$parse 是一个独立的可以注入的服务,注入就可以使用,它返回一个函数,我们需要显式将表达式求值的上下文传递给该函数.$par ...

  3. centos救援模式实验笔记

    1.  首先在BIOS中把启动选项设置成DVD光驱启动或者USB启动也是可以的 2.  从光盘启动之后再出现的选项中选择“Rescue installed system”然后按回车确认,具体图下图: ...

  4. 有人在用fastReport作报表时处理过字体自动缩小的问题吗,怎么做

    有人在用fastReport作报表时处理过字体自动缩小的问题吗,怎么做  我来答   浏览 49 次 1个回答 #吃瓜大会# Angelababy演技被吐槽, 你觉得她的演技怎么样? 最佳答案 热心 ...

  5. FastReport报表设计(仔细看)

    FastReport报表设计 2011-06-16 16:56:19|  分类: 系统开发|举报|字号 订阅     下载LOFTER我的照片书  |     目录 5.1 前言 5.2 基本概念及操 ...

  6. 转:iOS9的新特性以及适配方案

    2015年9月8日,苹果宣布iOS 9操作系统的正式版在太平洋时间9月16日正式推出,北京时间9月17日凌晨1点推送. 新的iOS 9系统比iOS8更稳定,功能更全面,而且还更加开放.iOS 9加入了 ...

  7. linux上安装python2.7.11

    好久不玩儿linux了,本来就不熟,现在几乎白痴.步骤如下: 从python官网上下载python的源代码 tar zvxf后得到一个文件夹: 进入Python-2.7.11,按照https://do ...

  8. ASP.NET中实现回调

    一.引言 在ASp.NET网页的默认模型中,用户通过单击按钮或其他操作的方式来提交页面,此时客户端将当前页面表单中的所有数据(包括一些自动生成的隐藏域)都提交到服务器端,服务器将重新实例化一个当前页面 ...

  9. nginx和tomcat访问图片和静态页面的配置方法

    生产环境下,有时候需要访问图片,正常需要应用ftp.nginx等配套使用,但是有时候为了简化,可以用以下的两种简单的访问,说实话,就是为了偷懒,但是效果是能有的,这就行了,所以今天做这个简化版的方便大 ...

  10. 一步步Cobol 400 上手自学入门教程03 - 数据部

    数据部的作用 程序中涉及到的全部数据(输入.输出.中间)都要在此定义,对它们的属性进行说明.主要描述以下属性: 数据类型(数值/字符)和存储形式(长度) 数据项之间的关系(层次和层号) 文件与记录的关 ...