网站空间如何备份,用虚拟机做网站的心得体会,全世界做会展介绍的网站排名,文化设计有限公司1. 概述
在现实生活中#xff0c;常常会出现这样的事例#xff1a;一个请求有多个对象可以处理#xff0c;但每个对象的处理条件或权限不同。例如#xff0c;公司员工请假#xff0c;可批假的领导有部门负责人、副总经理、总经理等#xff0c;但每个领导能批准的天数不同…1. 概述
在现实生活中常常会出现这样的事例一个请求有多个对象可以处理但每个对象的处理条件或权限不同。例如公司员工请假可批假的领导有部门负责人、副总经理、总经理等但每个领导能批准的天数不同员工必须根据自己要请假的天数去找不同的领导签名也就是说员工必须记住每个领导的姓名、电话和地址等信息这增加了难度。这样的例子还有很多如找领导出差报销、生活中的“击鼓传花”游戏等。
定义
又名职责链模式为了避免请求发送者与多个请求处理者耦合在一起将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链当有请求发生时可将请求沿着这条链传递直到有对象处理它为止。
比较常见的springmvc中的拦截器web开发中的filter过滤器。 2. 结构
职责链模式主要包含以下角色
抽象处理者Handler角色定义一个处理请求的接口包含抽象处理方法和一个后继连接。具体处理者Concrete Handler角色实现抽象处理者的处理方法判断能否处理本次请求如果可以处理请求则处理否则将该请求转给它的后继者。客户类Client角色创建处理链并向链头的具体处理者对象提交请求它不关心处理细节和请求的传递过程。
3. 案例实现
处理订单的操作 类图 代码
抽象处理者
package com.dcxuexi.designpattern.chain;/*** 抽象处理者*/
public abstract class Handler {protected Handler handler;public void setNext(Handler handler) {this.handler handler;}/*** 处理过程* 需要子类进行实现*/public abstract void process(OrderInfo order);
}订单信息类
package com.dcxuexi.designpattern.chain;import java.math.BigDecimal;public class OrderInfo {private String productId;private String userId;private BigDecimal amount;public String getProductId() {return productId;}public void setProductId(String productId) {this.productId productId;}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId userId;}public BigDecimal getAmount() {return amount;}public void setAmount(BigDecimal amount) {this.amount amount;}
}具体处理者
/*** 订单校验*/
public class OrderValidition extends Handler {Overridepublic void process(OrderInfo order) {System.out.println(校验订单基本信息);//校验handler.process(order);}}/*** 补充订单信息*/
public class OrderFill extends Handler {Overridepublic void process(OrderInfo order) {System.out.println(补充订单信息);handler.process(order);}}/*** 计算金额*/
public class OrderAmountCalcuate extends Handler {Overridepublic void process(OrderInfo order) {System.out.println(计算金额-优惠券、VIP、活动打折);handler.process(order);}}/*** 订单入库*/
public class OrderCreate extends Handler {Overridepublic void process(OrderInfo order) {System.out.println(订单入库);}
}
客户类
public class Application {public static void main(String[] args) {//检验订单Handler orderValidition new OrderValidition();//补充订单信息Handler orderFill new OrderFill();//订单算价Handler orderAmountCalcuate new OrderAmountCalcuate();//订单落库Handler orderCreate new OrderCreate();//设置责任链路orderValidition.setNext(orderFill);orderFill.setNext(orderAmountCalcuate);orderAmountCalcuate.setNext(orderCreate);//开始执行orderValidition.process(new OrderInfo());}}4. 优缺点
优点 降低了对象之间的耦合度 该模式降低了请求发送者和接收者的耦合度。 增强了系统的可扩展性 可以根据需要增加新的请求处理类满足开闭原则。 增强了给对象指派职责的灵活性 当工作流程发生变化可以动态地改变链内的成员或者修改它们的次序也可动态地新增或者删除责任。 责任链简化了对象之间的连接 一个对象只需保持一个指向其后继者的引用不需保持其他所有处理者的引用这避免了使用众多的if或者if···else语句。 责任分担 每个类只需要处理自己该处理的工作不能处理的传递给下一个对象完成明确各类的责任范围符合类的单一职责原则。
缺点
不能保证每个请求一定被处理。由于一个请求没有明确的接收者所以不能保证它一定会被处理该请求可能一直传到链的末端都得不到处理。对比较长的职责链请求的处理可能涉及多个处理对象系统性能将受到一定影响。职责链建立的合理性要靠客户端来保证增加了客户端的复杂性可能会由于职责链的错误设置而导致系统出错如可能会造成循环调用。
4. 举一反三 内容审核视频、文章、课程…. 订单创建 简易流程审批
能会由于职责链的错误设置而导致系统出错如可能会造成循环调用。