首页 > 编程语言 >javascript设计模式-责任链

javascript设计模式-责任链

时间:2023-06-01 20:31:43浏览次数:44  
标签:function javascript 责任 book var new setSuccessor 设计模式 successor

责任链

可以用来消除请求的发送者和接收者之间的耦合,这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的。链中的每个对象可以处理请求,也可以将其传给下一个对象。JS内部就使用了这种模式来处一事件捕获和冒泡问题。一般的结构如下:

  • 发送者知道链中的第一个接收者,它向这个接收者发送请求;
  • 第一个接收者都对请求进行分析,然后要么处理它,要么将其向下传递;
  • 每一个接收者知道其他对象只有一个,即它在链中的下家;
  • 如果没有任何请求处理请求,那么请求将从链上离开,不同的实现有不同的反应,可以不处理也可以抛出异常;
var Catalog = new Interface('Catalog', ['handleFilingRequest', 'findBooks','setSuccessor']);
var GenreCatalog = function() { // implements Catalog
    this.successor = null;
    this.catalog = [];
};
GenreCatalog.prototype = {
    _bookMatchesCriteria:function(){},
    handleFilingRequest: function(book) {
        if(this._bookMatchesCriteria)//循环调用
            this.successor.handleFilingRequest(book);
    },
    findBooks: function(request) {},
    setSuccessor: function(successor) {
        if(Interface.ensureImplements(successor, Catalog)){
            this.successor = successor;
        }
    }
};

var SciFiCatalog = function() {}; // implements Catalog
extend(SciFiCatalog, GenreCatalog);
SciFiCatalog.prototype._bookMatchesCriteria = function(book) {
    if(book.getTitle().match(/space/i)) {
        return true;
    }
    return false;
};

var Library = new Interface('Library', ['addBook', 'findBooks', 'checkoutBook','returnBook']);
var PublicLibrary = function(books, firstGenreCatalog) { // implements Library
    this.catalog = {};
    this.firstGenreCatalog = firstGenreCatalog;
};
PublicLibrary.prototype = {
    findBooks: function(searchString) {},
    checkoutBook: function(book) { },
    returnBook: function(book) {},
    addBook: function(newBook) {
        this.catalog[newBook.getIsbn()] = { book: newBook, available: true };
        // 开始调用
        this.firstGenreCatalog.handleFilingRequest(newBook);
    }
};

// Instantiate the catalogs.
var biographyCatalog = new BiographyCatalog();
var fantasyCatalog = new FantasyCatalog();
var mysteryCatalog = new MysteryCatalog();
var sciFiCatalog = new SciFiCatalog();

// 组织责任链.
biographyCatalog.setSuccessor(fantasyCatalog);
fantasyCatalog.setSuccessor(mysteryCatalog);
mysteryCatalog.setSuccessor(nonFictionCatalog);
nonFictionCatalog.setSuccessor(sciFiCatalog);

// Give the first link in the chain as an argument to the constructor.
var myLibrary = new PublicLibrary(books, biographyCatalog);

使用这种模式可以把特定的具体类与客户隔离开,并代之以一条由弱耦合的对象组成的链。它将隐式的对请求进行处理。这有助于提高代码的模块化程度和可维护性。

这种模式有个缺点就是处理全是隐式的,所以不知道是否整个链走完了,或是是否被合理的处理了。所以需要程序员在不同的点给出确认。和双向观察者很类似。

标签:function,javascript,责任,book,var,new,setSuccessor,设计模式,successor
From: https://blog.51cto.com/arch/6397840

相关文章

  • z-index控制层级显示【JavaScript-Dom&Bom】
    溢出设置overflowvisible(默认)超出部分显示hidden超出部分隐藏scroll超出部分滚动显示行内元素垂直对齐方式vertical-alignbaseline基线对齐(默认)top上对齐middle中间对齐bottom下对齐控制显示层级当元素为非static定位时,可能出现层叠......
  • JS垃圾回收——和其他语言一样,JavaScript 的 GC 策略也无法避免一个问题:GC 时,停止响应
    JavaScript内存管理&垃圾回收机制标记清除js中最常用的垃圾回收方式就是标记清除。当变量进入环境时,例如,在函数中声明一个变量,就将这个而变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离......
  • golang实现设计模式之构建者模式总结-代码、优缺点、适用场景
    构建者模式也是一种创建型的设计模式,该模式将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的对象。大白话就是,构建者模式,从输出角度看依然是创建个对象实例,但是构建者模式更关注创建的细节,或者说一个对象的创建可以拆分为多个步骤,所有的步骤完成才创建出这个对......
  • Go设计模式
    Go-设计模式整理参考:Go设计模式24-总结(更新完毕)-Mohuishou(lailin.xyz)go设计模式实现,包含23种常见的设计模式实现设计模式学习的重点是什么?设计原则,以及设计模式的使用场景和优缺点,实现相对来说还没有那么重要如果是常见的设计模式是武术招式,那么设计原则就是内......
  • jQuery 是javascript的一个库(常用插件、处理器)
    jQuery校验官网地址:http://bassistance.de/jquery-plugins/jquery-plugin-validationjQuery就是javascript的一个库,把我们常用的一些功能进行了封装,方便我们来调用,提高我们的开发效率。极大地简化了JavaScript编程。Javascipt跟jQuery的区别:Javascript是一门编程语言,我们用......
  • JavaScript原生实现《贪吃蛇》
    概述JavaScript原生实现《贪吃蛇》,每吃掉一个食物,蛇的身体会变长,食物会重新换位置。详细贪吃蛇大家都不陌生吧~简单做一个。一、思路1.让我们的小蛇动起来2.随机生成食物3.每吃掉一个食物,蛇的身体会变长,食物会重新换位置html界面<divclass="face"><!--小蛇移......
  • Javascript --常用技巧
    1)使用!!将变量转换成布尔类型有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将它们的值视为true。对于做这样的检查,你可以使用||(双重否定运算符),它能自动将任何类型的数据转换为布尔值,只有这些变量才会返回false:0,null,"",undefined或NaN,其他的都返回true。我们来看看......
  • JavaScript中几种 获取元素的方式
    1.根据id获取元素document.getElementById("id属性的值");2.根据标签名字获取元素document.getElementsByTagName("标签的名字");3.根据name属性的值获取元素document.getElementsByName("name属性的值");4.根据类样式的名字获取元素document.getElementsByClassName("类样式的名......
  • javascript 的 事件类型(事件)
    事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行。事件是文档或者浏览器窗口中发生的,特定的交互瞬间。事件是用户或浏览器自身执行的某种动作,如click,load和mouseover都是事件的名字。事件是javaScript和DOM之间交互的桥梁。你若触发,我便执行——事件发生,调用......
  • Java 微服务中的聚合器设计模式示例
    微服务架构中的聚合器设计模式是一种设计模式,用于通过聚合多个独立的微服务的响应来组成一个复杂的服务。它也是与SAGA、CQRS和EventSourcing一起的基本微服务设计模式之一。当客户端请求需要跨多个微服务分布的数据或功能时,此模式是合适的。可以提高系统的性能和可扩展性通过允许......