【JS设计模式】责任链设计模式的代码示例

责任链设计模式:

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

责任链模式涉及到的角色如下所示:
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作。

● 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

在JS(ES6之前)中严格意义上是没有extends继承概念,所以以下代码没有模拟抽象类,代码中只实现了具体处理类.

使用场景:在一个购物商城,在五一做了一个活动,所以图书类商品根据购买的金额依次做出以下折扣方案,
1、购买满199元,打9折
2、购买满399元,打8折
3、购买满599元以上,打7折;

责任链链的优点:

请求发送者只需要知道链中的第一个节点,从而弱化了发送者和一组接收者之间的强联系。如果不使用责任链链模式、根据当前价格客户端要知道每一级打折信息,最后知道具体是那一层上打折才是符合当前价格的折扣。

function BookHandler() {
  this.calcPrice = function( price ) {
    if ( 199 > price ) {
      console.log("原价是:"+ price);
    } else {
      this.successor.calcPrice( price );
    }
  }
  this.setSuccessor = function( _successor ) {
    this.successor = _successor;
  }
}

function BookCalc9Handler( _successor ) {

  this.calcPrice = function( price ) {
    if ( 199 <= price && price < 399 ) {
      console.log("原价是:"+ price +";打9折后:" + (price * 0.9));
    } else {
      this.successor.calcPrice( price );
    }
  }
  this.setSuccessor = function( _successor ) {
    this.successor = _successor;
  }
}

function BookCalc8Handler() {

  this.calcPrice = function( price ) {
    if ( 399 <= price && price < 599 ) {
      console.log("原价是:"+ price +";打8折后:" + (price * 0.8));
    } else {
      this.successor.calcPrice( price )
    }
  }
  this.setSuccessor = function( _successor ) {
    this.successor = _successor;
  }
}

function BookCalc7Handler() {

  this.calcPrice = function( price ) {
    if ( price >= 599 ) {
      console.log("原价是:"+ price +";打7折后:" + (price * 0.7));
    } else {
      this.successor.calcPrice( price )
    }
  }
  this.setSuccessor = function( _successor ) {
    this.successor = _successor;
  }
}

客户端 :

var price = 400;
var bookHandler = new BookHandler();
var bookCalc9Handler = new BookCalc9Handler();
var bookCalc8Handler = new BookCalc8Handler();
var bookCalc7Handler = new BookCalc7Handler();

bookHandler.setSuccessor(bookCalc9Handler);
bookCalc9Handler.setSuccessor(bookCalc8Handler);
bookCalc8Handler.setSuccessor(bookCalc7Handler);
bookHandler.calcPrice(price);

Console.log打印出来的效果:

时间: 2024-08-09 17:07:52

【JS设计模式】责任链设计模式的代码示例的相关文章

设计模式-责任链设计

看了一下设计模式中的责任链设计模式,主要实现类似拦截器的功能,记下来方便自己以后复习. 1.应用场景 假设要处理爬虫趴下来的内容,你就需要发这些内容进行去噪,例如:取格式化html标签,去页面脚本,去敏感信息等等,如果将这些过滤内容都写在一个方法中,那么势必造成代码耦合性强,如果以后不断的添加内容,将造成很大的维护成本. 所以,我们需要把变化的内容抽取出来定义为接口,需要使用时我们只需实现其对应的操作. 2.实例应用 1. 内容去噪过滤 先定义过滤接口 package org.andy.filt

Java设计模式之责任链设计模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. ? 请求传递方向:从低级到高级 ? 重点:如何形成这个责任链 ? 特点:发出处理请求的客户端并不知道是系统当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任.1. 派生类中都具备的功能(1) 都要设置后继者(一样)(2) 都能实现自己职责范围

java 设计模式 -- 责任链模式

设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪个对象处理,这使得我们能够动态的添加链上的对象而且分配责任. 纯责任链和非纯责任链 责任链分为两种.纯责任链和非纯责任链. 纯责任链是待处理对象request在处理对象handler链上传递,每一个处理对象handler处理request的一部分,到终于处理完毕.非纯责任链则是待处理对象reques

设计模式-责任链模式在实际项目中的使用

最近一次迭代,参与了公司数据应用平台的开发,其中负责的一块功能早早的就完成了代码的编写工作,即将进入测试阶段,因为有时间思考和总结代码编写中遇到的难题,便想着将代码做一次重构:其中优化的一个功能就是关于数据平台敏感字段的收集 功能描述:数据平台敏感字段的收集: 提供 service 方法,查询是否需要扫描表做触发式收集,指定具体实例与库的表,随机取 N 行(1~max(id) 之间):a.对每一行的每一个字段的值(取非 null 非空的值)做正则匹配 b. 对每一行的每一个字段的值看是否包含了敏

[设计模式] 责任链模式之变种 - 责任链子

今天看到 wikipedia 的责任链模式,好奇之下搜寻相关文章,此文章主要参考 91大的 [.NET]重构之路系列v11 –用责任链模式打破讨厌的switch case 的变种作法,所以跟原本的责任链模式的设计思路不太相同,但结果相同, 所以阅读前,建议先看完91大的文章后,在来看这篇会比较能感觉出差异. ?这边先引用91大文章结尾结论中的补充来复习一下责任链的重点, 20120415 补充:责任链的用意在于把每个角色的职责分清楚,每个对象只需要做好自己的事,透过责任链的方式来组合,并完成使用

编程内功修炼之设计模式—责任链模式

在设计模式不清楚的情况下,学习各种框架不仅难学懂,也难理解,即使理解也不够深刻. 为了走更远的路,从基础抓起,每天坚持前进一小步! 虽然即将毕业,虽然路途很远,没有梦想何必远方! package edu.designpattern.chainofresponsibility; import java.util.ArrayList; import java.util.List; import org.junit.Test; /** * 责任链设计模式 * 模型练习 * * @author heli

设计模式--责任链

Mark:关于责任链Demo. 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 类图: 请假--审批(转) 描述: 请假这个事情,相信每个人都不陌生. 我们公司是个相对很宽松的公司. 在公司里,如果你的请假时间小于0.5天,那么只需要向项目经理打声招呼就OK了. 如果超过了0.5天,但是还小于2天,那么就要去找人事部处理,当然,这就要扣工资了. 如果超过了2天,你就需要去找总经理了,工资

责任链设计模式(过滤器、拦截器)

责任链设计模式(Chain of Responsibility)的应用有:Java Web中的过滤器链.Struts2中的拦截器栈. 先看一个问题: 给定一个字符串“被就业了:),敏感信息,<script>”,对其中的HTML标记和敏感词进行过滤或替换.本文主要以该问题设计方法的演变来讲解责任链设计模式. 第一种设计:没有任何设计模式 设计了一个MsgProcessor类,完成字符串处理的主要工作.MainClass类是本设计中的测试类. 01 02 03 04 05 06 07 08 09

PHP责任链设计模式

<?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; protected $top='admin'; public function process($lev){ if($lev<=$this->power){ echo "版主删帖"; }else{ $top=new $this->top; $top->process($l