javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇《javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)》里,通过采用模板方法模式完成了切换效果对象的构建编写。
接下来就是完成各效果对象的调用和联动。
切换要求:当前图片显示指定时间后执行切换效果并切换下一张图片,最后一个切换后从头开始。
按照要求一个效果对象完成后要执行下一个,最后一个完成后要从头开始, 看上去就是一个带状态通知的环形列表,类似于这样的特征,可以采用职责链模式来构建。
职责链就是由不同的功能处理构成的链表,每一个功能处理作为一个职责,每一个职责完成后传递给下一个,特点就是每一个职责处理范围很明确符合单一职责,扩展方便,而且符合开闭原则。
基于上一篇,肯定先赋予这些效果对象具备构成链表的能力。
现在是体现抽象和继承的时候了。
对baseEffect对象增加指向下一个效果对象的属性,并增加获取下一个效果对象的属性。
var baseEffect = {
__nextEffect: null,
prepare: function (context) {
throw new Error('请重写prepare方法');
},
transform: function (context) {
throw new Error('请重写transform方法');
},
execute: function (context) {
this.prepare(context);
return this.transform(context);
},
setNext: function (effect) {
return this.__nextEffect = effect;
},
next: function () {
return this.__nextEffect;
}
};
其中setNext方法就是设置下一个效果对象,并且必须返回设置的对象,这样在设置的时候就可以构成链式调用。
在baseEffect这个抽象对象中增加了链表构建的功能后,其他继承的子效果对象无需修改代码即可。
增加了链表的构建后的curtain入口函数中,将各个效果对象采用链表+链式调用的方式非常简单的就构建起来,并且将他们首尾相接。
jquery.fn.curtain = function (options) { init(setDefaultOptions(options, this)); downToUpEffect
.setNext(upToDownEffect)
.setNext(leftToRightEffect)
.setNext(rightToLeftEffect)
.setNext(upDownCrossInEffect)
.setNext(upDownCrossOutffect)
.setNext(downToUpEffect); }
最后一步就是进行调用了。
编写一个executeEffect函数,接受effec和contextt参数,effect可传入效果对象链表的第一个。
用一个timer指定间隔时间后调用效果对象的execute方法并传入context执行效果处理。
一个效果对象执行完成后,通过promise的方式将完成状态通过done进行响应处理,最后就是递归调用executeEffect,并且传递下一个效果对象。
function executeEffect(effect, context) {
setTimeout(
function () {
effect.execute(context).done(
function () {
executeEffect(effect.next(), context);
});
}, context.interval * 1000);
}
完成curtain入口函数对各效果的执行。
增加一句调用即可。
jquery.fn.curtain = function (options) { init(setDefaultOptions(options, this)); downToUpEffect
.setNext(upToDownEffect)
.setNext(leftToRightEffect)
.setNext(rightToLeftEffect)
.setNext(upDownCrossInEffect)
.setNext(upDownCrossOutffect)
.setNext(downToUpEffect); executeEffect(downToUpEffect, context); }
通过职责链模式的构建出的效果执行的链表易于使用易于扩展,以后要加个效果,只要编写效果本身的代码,将其增加到职责链的某个位置,其余代码尽可能的无需修改,非常易于扩展。
这就是职责链的特点。
至此,全部完成。
代码:戳
javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)的更多相关文章
- javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)
在上一篇<javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)>里,通过采用迭代器模式完成了各初始化函数的定义和调用. 接下来就要完成各个切换效果的编 ...
- javascript设计模式实践之迭代器--具有百叶窗切换图片效果的JQuery插件(一)
类似于幻灯片的切换效果,有时需要在网页中完成一些图片的自动切换效果,比如广告,宣传,产品介绍之类的,那么单纯的切就没意思了,需要在切换的时候通过一些效果使得切换生动些. 比较常用之一的就是窗帘切换了. ...
- 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...
- Java设计模式之《职责链模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6530089.html 职责链模式(称责任链模式)将请求的处理对象像一条长链一般组合起来,形 ...
- 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)
设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...
- atitit.(设计模式1)--—职责链(chain of responsibility)最佳实践O7 转换日期
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 能够选择的模式: 表格模式,责任链模式 1 3 ...
- 大话设计模式Python实现-职责链模式
职责链模式(Chain Of Responsibility):使多个对象都有机会处理请求,从而避免发送者和接收者的耦合关系.将对象连成链并沿着这条链传递请求直到被处理 下面是一个设计模式的demo: ...
- C#设计模式系列:职责链模式(Chain of Responsibility)
1.职责链模式简介 1.1>.定义 职责链模式是一种行为模式,为解除请求的发送者和接收者之间的耦合,而使多个对象都有机会处理这个请求.将这些对象连接成一条链,并沿着这条链传递该请求,直到有一个对 ...
- OOP设计模式[JAVA]——03职责链模式
职责链模式 Responsibility of Chain 在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求 ...
随机推荐
- ABP理论学习之MVC视图
返回总目录 本篇目录 介绍 AbpWebViewPage基类 介绍 ABP通过Abp.Web.Mvc Nuget包集成了MVC视图.因此你可以像常规那样创建MVC视图. AbpWebViewPage基 ...
- 对改善ABP的一些建议
园子里有不少同学对ABP框架很感兴趣,而且也已经将ABP用在了商用项目中,有些可能还在操练阶段.一般来说,我们使用ABP默认的一些功能已经足够了,但还是有很多人想要自己拓展一些功能而自己实现不了或者说 ...
- 让linux好用起来--操作使用技巧
让linux好用起来--操作使用技巧 1 概述 在一个初学者眼里,linux的 CLI 界面没有图形界面那样多彩和友好,会让人产生畏难心理,但是作为一个稍微进阶的linux玩家,自然会积累不少经验 ...
- iOS开发系列--C语言之基础知识
概览 当前移动开发的趋势已经势不可挡,这个系列希望浅谈一下个人对IOS开发的一些见解,这个IOS系列计划从几个角度去说IOS开发: C语言 OC基础 IOS开发(iphone/ipad) Swift ...
- 玩转动态编译 - 高级篇:一,IL访问静态属性和字段
IL介绍 通用中间语言(Common Intermediate Language,简称CIL,发音为"sill"或"kill")是一种属于通用语言架构和.NET ...
- 使用HTML5的History API
HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...
- Node.js开发者最常范的10个错误
目录 前言 1 不使用开发工具 1.1 自动重启工具 1.2 浏览器自动刷新工具 2 阻塞event loop 3 频繁调用回调函数 4 圣诞树结构的回调(回调的地狱) 5 创建一个大而完整的应用程序 ...
- JS实战 · 复选框全选操作
思路: 1.获取被选中checkbox,通过checked属性的状态完成: 2.获取被选中的checkbox的value值: 3.求所有value的和sum: 4.定义span区域存储和sum: ...
- 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7 在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ ...
- EMC学习之电磁辐射
我们在接触新鲜事物的时候,通常习惯用自己熟悉的知识去解释自己不熟悉的事物.EMC知识更多的涉及到微波和射频,对于像我这种专注于信号完整性而 对EMC知识知之甚少的菜鸟来说,最初也只能用SI的一些基础知 ...