JS设计模式初识(十)-职责链模式

定义

职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。 类似于上级分配给给下级任务...

职责链模式的最大优点:请求发送者只需要知道链中的第一个节点,从而弱化了发送者和一组接收者之间的强联系。我们只需要将硬币传递个面前的人,直到给到售票员手里,算是这个任务结束。如果不使用职责链模式,我就得先搞清楚谁是售票员,才能把硬币递给他。

10.1 订单案例

公司针对支付过定金的用户有一定的优惠政策。

  • 500元定金的用户: 会收到100元的商城优惠券,

  • 200元定金的用户: 可以收到50元的优惠券,

  • 普通用户: 无优惠券,且受到库存的影响

  • 而之前没有支付定金的用户自动降级为普通购买模式,

  • orderType: 1: 500元定金用户, 2: 200元 , 3: 普通用户

  • isPay: 是否支付过 true: 是, false: 否

  • stock 库存量

10.2 实现需求
    // 订单函数
    function order(orderType, isPay, stock) {
        if (orderType === 1) {
            if (isPay) {
                console.log(' => 500元定金用户, 得到100元优惠券',);
            } else {
                if (stock > 0) {
                    console.log(' => 普通用户, 无优惠券',);
                }
            }
        } else if (orderType === 2) {
            if (isPay) {
                console.log(' => 200元定金用户, 得到50元优惠券',);
            } else {
                if (stock > 0) {
                    console.log(' => 普通用户, 无优惠券',);
                }
            }
        } else {
            if (stock > 0) {
                console.log(' => 普通用户, 无优惠券',);
            } else {
                console.log(' => 库存不足',);
            }
        }
    }
    order( 1 , true, 500); // 输出: 500 元定金预购, 得到 100 优惠券
复制代码
10.2 改进一下

上面的实现使用了太多的if else 导致代码很乱,很难懂, 下面稍微改进一下

    function order500(orderType, isPay, stock) {
        if (orderType === 1 && isPay) {
            console.log(' => 500元定金用户, 得到100元优惠券',);
        } else {
            order200(orderType, isPay, stock); // order200 和 order500 耦合在一起
        }
    }
    
    function order200(orderType, isPay, stock) {
        if (orderType === 2 && isPay) {
            console.log(' => 200元定金用户, 得到50元优惠券',);
        } else {
            orderNormal(orderType, isPay, stock);
        }
    }
    
    function orderNormal(orderType, isPay, stock) {
        if (stock > 0) {
            console.log(' => 普通用户, 无优惠券',);
        } else {
            console.log(' => 库存不足',);
        }
    }
复制代码

但是这个函数有个很明显的问题, 就是 order500和order200 是紧紧耦合在一起的

10.3 使用职责链模式改进函数
    function Chain(fn) {
        this.fn = fn;
        this.next = null;
    }
    Chain.prototype.setNext = function(next) {
        return this.next = next;
    }
    Chain.prototype.passRequest = function(...args) {
        let ret = this.fn.apply(this, next);
        if (ret === 'successToNext') { // 自动调用下一个函数
            return this.next();
        }
        return ret;
    }
    // 手动调用下一个
    Chain.prototype.next = function() {
        return this.next && this.next.apply(this.next, args);
    }
    
    // 生成链节点
    const ChainOrder500 = new Chain(order500);
    const ChainOrder200 = new Chain(order200);
    const ChainOrderNormal = new Chain(orderNormal);
    
    // 设置链节点执行顺序
    ChainOrder500.setNext(ChainOrder200).setNext(ChainOrderNormal);
    
    // 传给第一个节点
    chainOrder500.passRequest( 1, true, 500 );
复制代码

通过改进,我们可以自由灵活地增加、移除和修改链中的节点顺序,假如某天网站运营人员 又想出了支持 300 元定金购买,那我们就在该链中增加一个节点即可

    var order300 = function(){ // 具体实现略 };
    chainOrder300= new Chain(order300); 
    chainOrder500.setNext(chainOrder300).setNext(chainOrder200);;
复制代码

改进之前:

使用职责链改进后:

这个请求或者任务 会在往下传递, 直到有人接手完成了它,否则会一直传递下去,这个类似于 上级给一层层下级传递任务。

10.4 异步的职责链
    // 异步职责链
    const fn1 = new Chain(() => {
        console.log(' => fn1',);
        return 'successToNext';
    });
    const fn2 = new Chain(() => {
        console.log(' => fn2',);
        // 发送ajax success callback
        setTimeout(() => {
            this.next();
        }, 2000);
    });

    const fn3 = new Chain(() => {
        console.log('fn3 => ',);
    });

    fn1.setNext(fn2).setNext(fn3);
    fn1.passRequest();
复制代码
10.5 总结
  • 使用了职责链模式之后,链中的节点对象可以灵活地拆分重组。增加或者删除一个节点,或者改变节点在链中的位置都是轻而易举的事情。这一点我们也已经看到,在上面的例子中, 增加一种订单完全不需要改动其他订单函数中的代码。

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

转载于:https://juejin.im/post/5d04b5326fb9a07ef710718d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值