javascript设计模式-责任链

责任链

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

  • 发送者知道链中的第一个接收者,它向这个接收者发送请求;
  • 第一个接收者都对请求进行分析,然后要么处理它,要么将其向下传递;
  • 每一个接收者知道其他对象只有一个,即它在链中的下家;
  • 如果没有任何请求处理请求,那么请求将从链上离开,不同的实现有不同的反应,可以不处理也可以抛出异常;
javascript 复制代码
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);

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

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

相关推荐
彧azz3 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
嵌入式学习菌3 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
matlab代码4 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
CharlesYu014 小时前
前端性能优化的第一性原理,是不断缩短“用户发起意图 → 获得可用结果”之间的时间
前端
matlab代码5 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
平头哥技术团队5 小时前
Day 21 _ 页内锚点_给每段起个 id,目录写 href=_#id_,点一下页面就滚到那一段
前端·html·html5
wuyk5555 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080165 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
尘客-追梦5 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt
持敬chijing6 小时前
Python-数据类型-列表
开发语言·python·青少年编程