js设计模式总结3
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的更多相关文章
- JS设计模式(一)
		刚入职时,看过一段时间的设计模式,似懂非懂.不知不觉过去七个月了,对JS的理解更深刻了,数据结构与算法的基础也基本上算是过了一遍了,接下来要把设计模式搞定,然后不再深层次研究JS了,而是学习前端自动化 ... 
- js设计模式(12)---职责链模式
		0.前言 老实讲,看设计模式真得很痛苦,一则阅读过的代码太少:二则从来或者从没意识到使用过这些东西.所以我采用了看书(<js设计模式>)和阅读博客(大叔.alloyteam.聂微东)相结合 ... 
- JS设计模式——5.单体模式
		JS设计模式——5.单体模式 http://www.cnblogs.com/JChen666/p/3610585.html 单体模式的优势 用了这么久的单体模式,竟全然不知!用它具体有哪些好处呢? ... 
- js 设计模式-接口
		js模拟java接口检测函数:确保子类实现接口中的方法:(出自js设计模式) 上代码: <script type="text/javascript" > <%-- ... 
- 前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
		一.ES6语法 ES6中对数组新增了几个函数:map().filter().reduce() ES5新增的forEach(). 都是一些语法糖. 1.1 forEach()遍历数组 forEach() ... 
- [js]js设计模式小结
		js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ... 
- [js]设计模式小结&对原型的修改
		js设计模式小结 工厂模式/构造函数--减少重复 - 创建对象有new - 自动创建obj,this赋值 - 无return 原型链模式 - 进一步去重 类是函数数据类型,每个函数都有prototyp ... 
- js设计模式总结1
		js设计模式有很多种,知道不代表会用,更不代表理解,为了更好的理解每个设计模式,对每个设计模式进行总结,以后只要看到总结,就能知道该设计模式的作用,以及模式存在的优缺点,使用范围. 本文主要参考张容铭 ... 
- js设计模式-观察者模式
		定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ... 
- js设计模式:工厂模式、构造函数模式、原型模式、混合模式
		一.js面向对象程序 var o1 = new Object(); o1.name = "宾宾"; o1.sex = "男"; o1.a ... 
随机推荐
- DXP快捷键记录(红色为经常用到的)
			dxp快捷键 1.设计浏览器快捷键:鼠标左击 选择鼠标位置的文档鼠标双击 编辑鼠标位置的文档鼠标右击 ... 
- Android-Kotlin-空值处理&字符串比较&常量
			空值处理: [案例一:] 1.Kotlin对控制处理很严格,默认就不能写null,否则编译都不通过: 描述Car汽车对象: package cn.kotlin.kotlin_base01 /** * ... 
- [翻译]第二天 - Visual Studio 中的 .NET Core 模版一览
			原文: http://michaelcrump.net/part2-aspnetcore/ 免责声明:我不是 .NET Core 开发团队的一员,并且使用的是公开.可用的工具. 简介 该系列文章的完整 ... 
- 你所不知道的ASP.NET Core MVC/WebApi基础系列 (一)
			转自博客:https://www.cnblogs.com/CreateMyself/p/9235968.html 前言 最近发表的EF Core貌似有点多,可别误以为我只专攻EF Core哦,私下有时 ... 
- ServiceStack 错误处理
			抛出C#异常 在大多数情况下,您不需要关心ServiceStack的错误处理,因为它为抛出C#异常的正常用例提供本机支持,例如: public object Post(User request) { ... 
- Android 四大组件之“ BroadcastReceiver ”
			前言 Android四大组件重要性已经不言而喻了,今天谈谈的是Android中的广播机制.在我们上学的时候,每个班级的教室里都会装有一个喇叭,这些喇叭都是接入到学校的广播室的,一旦有什么重要的通知,就 ... 
- Android Parcelable using Kotlin
			Kotlin 有 extension 可以很方便的让类继承 Parcelable 接口. 项目中引入一个较新版本的 Kotlin 引入 Kotlin extensions classpath &quo ... 
- cad.net之ACAD和GCAD环境变量获取
			#if AC2006 || AC2007 || AC2008 || AC2009 || AC2010 || AC2011 || AC2012 [System.Security.SuppressUnma ... 
- wcf返回值报错解析
			问题来源 最近在项目中使用wcf,因为是一个新手,对新的东西总是比较敬畏,不过一切都是进行得很顺利,运行的时候,突然报了错,编译器提示的错误大概是:“InvalidOperationException ... 
- ie6兼容性处理
			IE6下border-bottom不起作用? 在IE6下,border-bottom:1px solid #000 不起作用,但border:1px solid #000 其作用. (经过测试,对于b ... 
