您的位置:首页 > Web前端

前端设计模式责任链模式

2016-07-21 22:52 691 查看
责任链的重点在 " 链 " 上,有一条链去处理相似的请求,在链中决定由于谁去处理这个请求,并返回相应的结果

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

使用场景:在一个购物商城,在五一做了一个活动,所以图书类商品根据购买的金额依次做出以下折扣方案,
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 语句
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: