责任链模式(行为类)

来源:互联网 发布:java主流框架有哪些 编辑:程序博客网 时间:2024/06/07 06:51

UML

这里写图片描述

  • Handler(抽象处理角色): 定义一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回下家的引用。
  • ConcreteHandler(具体处理者角色): 具体处理者角色接到请求后,可以选择将请求处理掉,或者传递到下家。

介绍

  • 意图:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
  • 优点: 1、降低耦合度。它将请求的发送者和接收者解耦。 2、简化了对象。使得对象不需要知道链的结构。 3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。 4、增加新的请求处理类很方便。
  • 缺点: 1、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。 2、可能不容易观察运行时的特征,有碍于除错。
  • 应用 jsp中Filter

例子

UML

这里写图片描述

介绍

销售打折权限请求案例

代码

PriceHandler(handler)

/* * 价格处理人,负责处理客户折扣申请 */public abstract class PriceHandler {    /*     * 直接后继,用于传递请求     */    protected PriceHandler successor;    public void setSuccessor(PriceHandler successor) {        this.successor = successor;    }    /*     * 处理折扣申请     */    public abstract  void processDiscount(float discount);}

Sales(ConcreteHandler)

/* * 销售, 可以批准5%以内的折扣 */public class Sales extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount <= 0.05){            System.out.format("%s批准了折扣:%.2f%n", this.getClass().getName(), discount);        }else{            successor.processDiscount(discount);        }    }}

Lead

/* * 销售小组长, 可以批准15%以内的折扣 */public class Lead extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount<=0.15){            System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);        }else{            successor.processDiscount(discount);        }    }}

Manager(ConcreteHandler)

/* * 销售经理, 可以批准30%以内的折扣 */public class Manager extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount<=0.3){            System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);        }else{            successor.processDiscount(discount);        }    }}

Director(ConcreteHandler)

/* * 销售总监, 可以批准40%以内的折扣 */public class Director extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount<=0.4){            System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);        }else{            successor.processDiscount(discount);        }    }}

VicePresident(ConcreteHandler)

/* * 销售副总裁, 可以批准50%以内的折扣 */public class VicePresident extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount<=0.5){            System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);        }else{            successor.processDiscount(discount);        }    }}

CEO

/* * CEO, 可以批准55%以内的折扣 * 折扣超出55%, 就拒绝申请 */public class CEO extends PriceHandler {    @Override    public void processDiscount(float discount) {        if(discount<=0.55){            System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(),discount);        }else{            System.out.format("%s拒绝了折扣:%.2f%n", this.getClass().getName(),discount);        }    }}

结果

1:com.java.cor.handler.Director批准了折扣:0.342:com.java.cor.handler.CEO拒绝了折扣:0.673:com.java.cor.handler.Director批准了折扣:0.384:com.java.cor.handler.Manager批准了折扣:0.235:com.java.cor.handler.CEO拒绝了折扣:0.906:com.java.cor.handler.VicePresident批准了折扣:0.437:com.java.cor.handler.VicePresident批准了折扣:0.418:com.java.cor.handler.Manager批准了折扣:0.179:com.java.cor.handler.CEO拒绝了折扣:0.6610:com.java.cor.handler.CEO拒绝了折扣:0.9011:com.java.cor.handler.CEO拒绝了折扣:0.9712:com.java.cor.handler.CEO拒绝了折扣:0.6813:com.java.cor.handler.Director批准了折扣:0.3514:com.java.cor.handler.VicePresident批准了折扣:0.4215:com.java.cor.handler.CEO拒绝了折扣:0.6716:com.java.cor.handler.Lead批准了折扣:0.1117:com.java.cor.handler.Lead批准了折扣:0.0918:com.java.cor.handler.Director批准了折扣:0.4019:com.java.cor.handler.CEO拒绝了折扣:0.8520:com.java.cor.handler.Lead批准了折扣:0.14

参考

  • 设计模式之禅
  • java与模式
  • 慕课网教学视频
0 0
原创粉丝点击