前端设计模式责任链模式

责任链的重点在 " 链 " 上,有一条链去处理相似的请求,在链中决定由于谁去处理这个请求,并返回相应的结果

使多个对象都有机会处理请求,直到有对应的分支进行处理。

使用场景:在一个购物商城,在五一做了一个活动,所以图书类商品根据购买的金额依次做出以下折扣方案,
1、购买满199元,打9折
2、购买满399元,打8折
3、购买满599元以上,打7折;

简单的责任链模式:(写了一个if的列子)

(1) if else if..

        function Discount(price) {
            if (199 > price) {
                console.log("原价:" + price);
            } else if (199 <= price && price < 399) {
                console.log("原价:" + price + ";打9折后:" + (price * 0.9));
            } else if (399 <= price && price < 599) {
                console.log("原价:" + price + ";打8折后:" + (price * 0.8));
            } else if (599 <= price) {
                console.log("原价:" + price + ";打7折后:" + (price * 0.7));
            }
        }
        Discount(99);
        Discount(299);
        Discount(399);
        Discount(599)

(2) switch case.....


使用责任链模式:(我把方法当作处理者,调用方法为请求者)

处理者:

        function Discount() {
            this.PriceHandles = function (price) {
                if (199 > price) {
                    console.log("原价:" + price);
                } else {
                    this.sucess.PriceHandles(price);
                }
            }
            this.setSucess = function (_sucess) {
                this.sucess = _sucess;
            }
        }
        function Discount9Handles() {
            this.PriceHandles = function (price) {
                if (199 <= price && price < 399) {
                    console.log("原价:" + price + ";打9折后:" + (price * 0.9));
                } else {
                    this.sucess.PriceHandles(price);
                }
            }
            this.setSucess = function (_sucess) {
                this.sucess = _sucess;
            }
        }
        function Discount8Handles() {
            this.PriceHandles = function (price) {
                if (399 <= price && price < 599) {
                    console.log("原价:" + price + ";打8折后:" + (price * 0.8));
                } else {
                    this.sucess.PriceHandles(price);
                }
            }
            this.setSucess = function (_sucess) {
                this.sucess = _sucess;
            }
        }
        function Discount7Handles() {
            this.PriceHandles = function (price) {
                if (599 <= price) {
                    console.log("原价:" + price + ";打7折后:" + (price * 0.7));
                } else {
                    this.sucess.PriceHandles(price);
                }
            }
            this.setSucess = function (_sucess) {
                this.sucess = _sucess;
            }
        }

请求者:

        var biscount9Handles = new Discount9Handles();
        var biscount8Handles = new Discount8Handles();
        var biscount7Handles = new Discount7Handles();
        biscount.setSucess(biscount9Handles);
        biscount9Handles.setSucess(biscount8Handles);
        biscount8Handles.setSucess(biscount7Handles);
        biscount.PriceHandles(99);
        biscount.PriceHandles(299);
        biscount.PriceHandles(399);
        biscount.PriceHandles(599);

这样我只需要去修改请求者的组合,而不需要去修改处理者的方法。


责任链模式的优点:

实现了请求者跟处理者分离:可以在不影响处理者情况下动态地重新组织和分配责任,提高系统的灵活性和可扩展性,因为责任链把条件判断都分散到了各个处理者方法里,并且这些处理者方法顺序可以随意设定。


责任链模式缺点:

正如 if 和switch的缺点一样,从链头开始,如果未找到正确的处理者,所有的处理者都要跑一次,当责任链比较长的时候,性能问题比较严重。

需要理解前后逻辑的条件判断关系,不要再链中出现循环引用的问题。

总结:

责任链是一个灵活的 if 和 switch 语句


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值