java设计模式--责任链 Chain of Responsibility

来源:互联网 发布:遥感大数据特点 编辑:程序博客网 时间:2024/05/22 13:47
在责任链模式里,请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。在以下条件下可考虑使用Chain of Responsibility:
1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2、你想在不明确指定接受者的情况下,想过个对象中的一个提交一个请求。
3、可处理一个请求的对象集合应该被动态指定。
示例:打折审批流程,销售人员能打折97%,销售主管打折不能大于95%,打折大于95%要经理审批。代码如下:

/** * 折扣审批抽象类 */public abstract class DiscountHandler {//下一个处理流程private DiscountHandler nextDiscountHandler;public void setNextDiscountHandler(DiscountHandler nextDiscountHandler) {this.nextDiscountHandler = nextDiscountHandler;}public DiscountHandler getNextDiscountHandler() {return nextDiscountHandler;}//折扣审批,留给子类实现public abstract void approve(int discount);}
下面是销售人员,销售主管,经理的审批流程:

/** * 销售人员,折扣不能小于97% */public class Seller extends DiscountHandler {public void approve(int discount) {if(discount>=97){System.out.println("Seller 审批通过");}else{//如果有下一级审批,则交给我下一级审批if(this.getNextDiscountHandler()!=null){this.getNextDiscountHandler().approve(discount);}}}}/** * 主管,折扣不能小于95% */public class Manager extends DiscountHandler {public void approve(int discount) {if(discount>=95){System.out.println("Manager 审批通过");}else{//如果有下一级审批,则交给我下一级审批if(this.getNextDiscountHandler()!=null){this.getNextDiscountHandler().approve(discount);}}}        }/** * 销售经理,经理审批折扣小于 95%的 */public class Amaldar extends DiscountHandler{public void approve(int discount) {if(discount<95){System.out.println("Amaldar 审批");}else{//如果有下一级审批,则交给我下一级审批if(this.getNextDiscountHandler()!=null){this.getNextDiscountHandler().approve(discount);}}}}

测试代码:

public static void main(String[] args) {        Amaldar amaldar = new Amaldar();        Manager manager = new Manager();        //设置上级审批,通过设置上级审批,形成一个审批链        manager.setNextDiscountHandler(amaldar);        //设置上级审批        Seller seller = new Seller();        seller.setNextDiscountHandler(manager);        seller.approve(94);        seller.approve(95);        seller.approve(96);        seller.approve(97);        seller.approve(98);    }

优点:
无法预知来自外界折扣是属于哪种类型,每个类如果碰到它不能处理的折扣信息只要放弃就可以。
缺点:
扩展性差,一定要有一个统一的接口。
缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成。

0 0
原创粉丝点击