zoukankan      html  css  js  c++  java
  • JavaScript设计模式样例十九 —— 职责链模式

    职责链模式(Chain of Responsibility Pattern)

    定义:为请求创建了一个接收者对象的链。
    目的:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
    场景:红楼梦中的"击鼓传花"。
    // 采购请求
    let PurchaseRequest = (amount, productName) => {
        this.amount = amount
        this.productName = productName
    }
    
    // 处理方
    let Approver = (name, nextApprover) => {
        this.name = name
        this.nextApprover = nextApprover
    }
    
    Approver.prototype.processRequest = () => {
        throw new Error()
    }
    
    // ConcreteHandler
    let Manager = (name, nextApprover) => {
        Approver.call(this, name, nextApprover)
    }
    extend(Manager, Approver)
    Manager.prototype.processRequest = (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)

    Git地址:https://github.com/skillnull/Design-Mode-Example

  • 相关阅读:
    呵呵,今天偶然看到了我最早期的商业网站作品
    轻量级的Ajax解决方案——DynAjax:直接在客户端调用C#类的方法
    RegexDesigner.NET 正则表达式开源工具
    Asp.net页面的生命周期之通俗理解
    我设计的公司网站主页 截图
    没想到裴勇俊留了一头长发。
    一个very好的Javascript ajax库,jQuery!
    JQuery资源收集
    收藏:悟透JavaScript
    VS2008 F5不能调试情况一例
  • 原文地址:https://www.cnblogs.com/Man-Dream-Necessary/p/12567684.html
Copyright © 2011-2022 走看看