最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Javascript 设计模式 - 职责链模式

    正文概述 掘金(alanyf)   2020-12-15   721

    在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推,直到有一个对象处理它为止。

    这种类型的设计模式属于行为型模式

    适用场景

    职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

    1. 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
    2. 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    3. 可动态指定一组对象处理请求。

    应用示例

    JS 中的事件冒泡
    express、koa中间件洋葱模型

    • 实现简易koa中间件【职责链模式】
    class Middleware {
        constructor() {
            this.middlewares = [];
        }
        use(fn) {
            if(typeof fn !== 'function') {
                throw new Error('Middleware must be function, but get ' + typeof fn);
            } 
            this.middlewares.push(fn);
            return this;
        }
        compose() {
            const middlewares = this.middlewares;
            return dispatch(0);
            function dispatch(index) {
                const middleware = middlewares[index];
                if (!middleware) {return;}
                try{
                    const ctx = {};
                    const result = middleware(ctx, dispatch.bind(null, index + 1));
                    return Promise.resolve(result);
                } catch(err) {
                    return Promise.reject(err);
                }
            }
        }
    }
    
    // 使用
    const middleware = new Middleware();
    middleware.use(async (ctx, next) => {
        console.log(1);
        await next();
        console.log(2);
    });
    middleware.use(async (ctx, next) => {
        console.log(3);
        await next();
        console.log(4);
    });
    middleware.compose();// 1 3 4 2
    

    优缺点

    优点:

    1. 降低耦合度。它将请求的发送者和接收者解耦。
    2. 简化了对象。使得对象不需要知道链的结构。
    3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
    4. 增加新的请求处理类很方便。

    缺点:

    1. 不能保证请求一定被接收。
    2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
    3. 可能不容易观察运行时的特征,有碍于除错。

    总结

    职责链模式可以很好地帮助我们管理代码,降低发起请求的对象和处理请求的对象之间的耦合性。职 责链中的节点数量和顺序是可以自由变化的,我们可以在运行时决定链中包含哪些节点。

    参考

    • JavaScript设计模式与开发实践
    • 设计模式 - 菜鸟教程

    起源地下载网 » Javascript 设计模式 - 职责链模式

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元