资讯专栏INFORMATION COLUMN

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

Null / 1981人阅读

摘要:责任链模式责任链模式指的是某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。介绍了这么多生活中责任链模式的例子的,下面具体给出面向对象中责任链模式的定义。

责任链模式
责任链模式指的是——某个请求需要多个对象进行处理,从而避免请求的发送者和接收之间的耦合关系。将这些对象连成一条链子,并沿着这条链子传递该请求,直到有对象处理它为止。

从生活中的例子可以发现,某个请求可能需要几个人的审批,即使技术经理审批完了,还需要上一级的审批。这样的例子,还有公司中的请假,少于3天的,直属Leader就可以批准,3天到7天之内就需要项目经理批准,多余7天的就需要技术总监的批准了。介绍了这么多生活中责任链模式的例子的,下面具体给出面向对象中责任链模式的定义。

责任链模式涉及的对象只有处理者角色,但由于有多个处理者,它们具有共同的处理请求的方法,所以这里抽象出一个抽象处理者角色进行代码复用.

实现

请求类

// 采购请求
let PurchaseRequest = function (amount, productName) {
    this.amount = amount;
    this.productName = productName;
};

处理者接口类

// 审批人,Handler
let Approver = function (name, nextApprover) {
    this.name = name;
    this.nextApprover = nextApprover;
};
Approver.prototype.processRequest = function () {
    throw new Error();  
};

处理者类

// ConcreteHandler
let Manager = function (name, nextApprover) {
    Approver.call(this, name, nextApprover);
};
extend(Manager, Approver);
Manager.prototype.processRequest = function (request) {
    if (request.Amount < 10000.0)
    {
        console.log("ok");
    }
    else if (NextApprover != null)
    {
        this.nextApprover.ProcessRequest(request);
    }   
};    
    
// ConcreteHandler,副总
let VicePresident = function (name, nextApprover) {
    Approver.call(this, name, nextApprover);
};
extend(VicePresident, Approver);
VicePresident.prototype.processRequest = function (request) {
    if (request.Amount < 25000.0)
    {
        console.log("ok");
    }
    else if (NextApprover != null)
    {
        this.nextApprover.ProcessRequest(request);
    }   
};


// ConcreteHandler,总经理
let President = function (name, nextApprover) {
    Approver.call(this, name, nextApprover);
};
extend(President, Approver);
President.prototype.processRequest = function (request) {
    if (request.Amount < 100000.0)
    {
        console.log("ok");
    }
    else if (NextApprover != null)
    {
        this.nextApprover.ProcessRequest(request);
    }   
};

测试
let requestTelphone = new PurchaseRequest(4000.0, "Telphone");
let requestSoftware = new PurchaseRequest(10000.0, "Visual Studio");
let requestComputers = new PurchaseRequest(40000.0, "Computers");

let manager = new Manager("LearningHard");
let Vp = new VicePresident("Tony");
let Pre = new President("BossTom");

// 设置责任链
manager.NextApprover = Vp;
Vp.NextApprover = Pre;

// 处理请求
manager.ProcessRequest(requestTelphone);
manager.ProcessRequest(requestSoftware);
manager.ProcessRequest(requestComputers);

使用场景

一个系统的审批需要多个对象才能完成处理的情况下,例如请假系统等。

代码中存在多个if-else语句的情况下,此时可以考虑使用责任链模式来对代码进行重构。

特点

降低了请求的发送者和接收者之间的耦合。

把多个条件判定分散到各个处理类中,使得代码更加清晰,责任更加明确。

  责任链模式也具有一定的缺点,如:

在找到正确的处理对象之前,所有的条件判定都要执行一遍,当责任链过长时,可能会引起性能的问题, 可能导致某个请求不被处理。

总结

责任链降低了请求端和接收端之间的耦合,使多个对象都有机会处理某个请求。使得责任分割, 更具体, 有助于拓展

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92970.html

相关文章

  • 利用责任模式设计一个拦截器

    摘要:前言近期在做的拦截器功能,正好用到了责任链模式。通过官方图就可以非常清楚的看出是一个责任链模式用责任链模式设计一个拦截器对于拦截器来说使用责任链模式再好不过了。设置拦截器到责任链中时通过反射将的值保存到各个拦截器中。 showImg(https://segmentfault.com/img/remote/1460000016756077?w=1733&h=1300); 前言 近期在做 ...

    dreamans 评论0 收藏0
  • JAVA设计模式责任模式

    摘要:责任链模式涉及到的角色如下所示抽象处理者角色定义一个处理请求的抽象类。如果一个类承担了一部分责任,还将请求踢给下一个皮球,则被称为不纯的责任链模式。一般来说,日常开发中不纯的责任链模式用的比较多一点。参考责任链模式更多文章 在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式。在责任链模式里,...

    libxd 评论0 收藏0
  • 我的Java设计模式-责任模式

    摘要:咦这一层一层上报就涉及到这次的责任链模式。责任链模式和观察者模式存在一个共同点,就是传递责任链模式是一级一级的传递,形成一条链,链节点处理者之间是存在传递关系的。这是责任链模式和观察者模式的区别,也是责任链模式的核心。 今天来说说程序员小猿和产品就关于需求发生的故事。前不久,小猿收到了产品的需求。 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的。 小猿:........

    douzifly 评论0 收藏0

发表评论

0条评论

Null

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<