当前位置: 首页 > news >正文

湖南省住房和城乡建设网站新手学做网站从哪里开始

湖南省住房和城乡建设网站,新手学做网站从哪里开始,上海app外包公司,网站建设需要哪些专业技术职责链模式简述 职责连是由多个不同的对象组成的#xff0c;有发送者跟接收者#xff0c;分别负责信息的发送跟接收#xff0c;其中#xff0c;链中第一个对象是 职责连是由多个不同的对象组成的#xff0c;发送者是发送请求的对象#xff0c;接收者接收请求并且对其进行…职责链模式简述 职责连是由多个不同的对象组成的有发送者跟接收者分别负责信息的发送跟接收其中链中第一个对象是 职责连是由多个不同的对象组成的发送者是发送请求的对象接收者接收请求并且对其进行处理或传递的对象。基本流程如下 发送者知道链中的第一个接收者它向这个接收者发送该请求。每一个接收者都对请求进行分析然后要么处理它要么它往下传递。每一个接收者知道其他的对象只有一个即它在链中的下家(successor)。如果没有任何接收者处理请求那么请求会从链中离开。职责链模式是个链式结构请求在链中的节点之间依次传递直到有一个对象能处理该请求为止。如果没有任何对象处理该请求的话那么请求就会从链中离开。 实战 以电商网站抽奖为例规则如下 用户充值500元可以100%中奖100元红包用户充值200元可以100%中奖20元红包用户不充值也可以抽奖但概率极低。用户充值失败按不充值处理。常规实现 首先需要定义几个字段 orderType充值类型。如果值为1的话说明是充值500元的用户如果为2的话说明是充值200元的用户如果是3的话说明是没有充值的用户。isPay是否已经成功充值了。 如果该值为true的话说明已经成功充值了否则的话说明没有充值成功就当作普通用户来购买。count表示数量。普通用户抽奖如果数量有的话就可以拿到优惠卷否则的话不能拿到优惠卷。实现如下 var order function(orderType,isPay,count) {if(orderType 1) { // 用户充值500元if(isPay true) { // 如果充值成功的话100%中奖console.log(亲爱的用户您中奖了100元红包了);}else {// 充值失败就当作普通用户来处理中奖信息if(count 0) {console.log(亲爱的用户您已抽到10元优惠卷);}else {console.log(亲爱的用户请再接再厉哦);}}}else if(orderType 2) { // 用户充值200元if(isPay true) { // 如果充值成功的话100%中奖console.log(亲爱的用户您中奖了20元红包了);}else {// 充值失败就当作普通用户来处理中奖信息if(count 0) {console.log(亲爱的用户您已抽到10元优惠卷);}else {console.log(亲爱的用户请再接再厉哦);}}}else if(orderType 3) {// 普通用户来处理中奖信息if(count 0) {console.log(亲爱的用户您已抽到10元优惠卷);}else {console.log(亲爱的用户请再接再厉哦);}} }; 复制代码如上代码虽然实现了需求但存在的问题也比较突出 一、业务逻辑代码耦合度太高如果想增加条件比如充值300可以中奖150元红包这时候就很容易改出问题 二、冗余代码太多普通用户抽奖的代码是可以单独抽离出来的 职责链实现 function order500(orderType,isPay,count){if(orderType 1 isPay true) {console.log(亲爱的用户您中奖了100元红包了);}else {//我不知道下一个节点是谁,反正把请求往后面传递return nextSuccessor;} }; function order200(orderType,isPay,count) {if(orderType 2 isPay true) {console.log(亲爱的用户您中奖了20元红包了);}else {//我不知道下一个节点是谁,反正把请求往后面传递return nextSuccessor;} }; function orderNormal(orderType,isPay,count){// 普通用户来处理中奖信息if(count 0) {console.log(亲爱的用户您已抽到10元优惠卷);}else {console.log(亲爱的用户请再接再厉哦);} } // 下面需要编写职责链模式的封装构造函数方法 var Chain function(fn){this.fn fn;this.successor null; }; Chain.prototype.setNextSuccessor function(successor){return this.successor successor; } // 把请求往下传递 Chain.prototype.passRequest function(){var ret this.fn.apply(this,arguments);if(ret nextSuccessor) {return this.successor this.successor.passRequest.apply(this.successor,arguments);}return ret; } //现在我们把3个函数分别包装成职责链节点 var chainOrder500 new Chain(order500); var chainOrder200 new Chain(order200); var chainOrderNormal new Chain(orderNormal);// 然后指定节点在职责链中的顺序 chainOrder500.setNextSuccessor(chainOrder200); chainOrder200.setNextSuccessor(chainOrderNormal);//最后把请求传递给第一个节点 chainOrder500.passRequest(1,true,500); // 亲爱的用户您中奖了100元红包了 chainOrder500.passRequest(2,true,500); // 亲爱的用户您中奖了20元红包了 chainOrder500.passRequest(3,true,500); // 亲爱的用户您已抽到10元优惠卷 chainOrder500.passRequest(1,false,0); // 亲爱的用户请再接再厉哦 复制代码如上代码 一、分别编写order500order200orderNormal三个函数处理自己的业务逻辑如果自己的函数不能处理的话就返回字符串nextSuccessor 往后面传递 二、封装Chain构造函数接收fn做为参数且带有属性successor。实例化后的Chain类型的对象就像一个一个独立存在的节点。 三、Chain构造函数原型上有2个方法分别是setNextSuccessor 和 passRequest。setNextSuccessor 方法指定了节点在职责链中的顺序passRequest方法是将请求转移到职责链的下一个节点。 如上文提到的假设需要实现“充值300中奖150元”我们可以编写order300这个函数通过Chain包装起来指定在职责链中的顺序即可。业务逻辑的代码不需要任何处理。 现在又有一个问题我们在开发中经常会碰到ajax异步请求如果我们用上面的做法就不生效了。由此便引出了异步的职责链来解决这个问题。我们给Chain类再增加一个原型方法Chain.prototype.next表示手动传递请求给职责链中的一下个节点。 function Fn1() {console.log(1);return nextSuccessor; } function Fn2() {console.log(2);var self this;setTimeout(function(){self.next();},1000); } function Fn3() {console.log(3); } // 下面需要编写职责链模式的封装构造函数方法 var Chain function(fn){this.fn fn;this.successor null; }; Chain.prototype.setNextSuccessor function(successor){return this.successor successor; } // 把请求往下传递 Chain.prototype.passRequest function(){var ret this.fn.apply(this,arguments);if(ret nextSuccessor) {return this.successor this.successor.passRequest.apply(this.successor,arguments);}return ret; } Chain.prototype.next function(){return this.successor this.successor.passRequest.apply(this.successor,arguments); } //现在我们把3个函数分别包装成职责链节点 var chainFn1 new Chain(Fn1); var chainFn2 new Chain(Fn2); var chainFn3 new Chain(Fn3);// 然后指定节点在职责链中的顺序 chainFn1.setNextSuccessor(chainFn2); chainFn2.setNextSuccessor(chainFn3);chainFn1.passRequest(); // 打印出12 过1秒后 会打印出3 复制代码如上代码当执行到F2时遇到了定时器异步函数当定时器执行结束后调用了next方法手动将请求交给职责链中的下一个节点因此过了一秒后会打印3。 总结 优点 解耦了请求发送者和度个接收者之间的复杂关系不需要知道链中哪个节点能处理你的请求只需要把请求传递到第一个节点即可。链中的节点对象可以灵活地拆分重组增加或删除一个节点或者改变节点的位置都是很简单的事情。我们还可以手动指定节点的起始位置并不是说非得要从其实节点开始传递的.缺点 职责链模式中多了一点节点对象可能在某一次请求过程中大部分节点没有起到实质性作用他们的作用只是让请求传递下去从性能方面考虑避免过长的职责链提高性能。
http://www.sadfv.cn/news/378504/

相关文章:

  • 网站服务器用哪个好北京装修大概多少钱一平方
  • 国外门户网站设计购物网站大全
  • 常州商城网站制作公司三合一网站有必要吗
  • 网站空间的控制面板首页提升学历选什么专业比较好
  • 网站建设专业性的评估标志设计图片
  • 网站内容维护合同做数据ppt模板下载网站
  • 免费做网站自助建站唐山专业网站建设公司
  • 传统网站建设网站做代理需要空间是多少钱
  • 佛山网站建设费用王也天 葛优
  • 辛集seo网站优化公司阿里云申请域名后网站
  • 成都大丰网站建设例表网wordpress自适应博客主题
  • 网站切图网络运维工程师需要考什么证书
  • 二手闲置平台网站怎么做百度商城网站建设
  • 网站备份信息网站维护页面 下载
  • 天津开发区建网站公司网站建设相关的博客有哪些
  • 免费ppt模板的网站网络营销要怎么做
  • 网站运营阶段大连建行网点
  • tq网站建设免费做外贸的网站建设
  • 织梦怎么做淘客网站wordpress 预订插件
  • 网站建设培训班学费win7网站建设
  • 学习网站开发教程泊头网站建设甘肃
  • 公司网站做一下多少钱价格低是什么意思
  • 手机网站设计费用wordpress 评论编辑器
  • uehtml 网站源码企业网址查询入口
  • 电子商务网站设计实验报告品牌策划的五个步骤
  • 租用网站的服务器网页小游戏网站建设
  • 怎样做网站不花钱宁波seo服务推广
  • 仿站网站源码重庆观音桥在哪个区
  • 壁纸网站模板如何获得企业邮箱
  • 免费网站自助建站中国建筑管网