责任链模式的实现和理解

来源:互联网 发布:知乐小说最好看 编辑:程序博客网 时间:2024/05/16 07:20

为了更好的理解mybatis中拦截器的实现,先来理解一下责任链模式的实现。

1.首先定义一个抽象类作为父类,这个父类中有一个属性,属性的类型是改父类,其职责为指定在整个责任链中当前对象的下家即后继。

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

2.定义子类,这些不同的子类就是责任链上的各个对象。

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

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

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

3.定义一个工厂,负责建立责任链,并指定责任链工作的起始对象。

package com.pattern.cor.handler;public class PriceHandlerFactory {/* * 创建PriceHandler的工厂方法 */public static PriceHandler createPriceHandler() {PriceHandler sales = new Sales();PriceHandler lead = new Lead();PriceHandler man = new Manager();sales.setSuccessor(lead);lead.setSuccessor(man);return sales;}}

3.客户端调用。

package com.pattern.cor;import java.util.Random;import com.pattern.cor.handler.PriceHandler;import com.pattern.cor.handler.PriceHandlerFactory;/* * 客户,请求折扣 */public class Customer {private PriceHandler priceHandler;public void setPriceHandler(PriceHandler priceHandler) {this.priceHandler = priceHandler;}public void requestDiscount(float discount){priceHandler.processDiscount(discount);}public static void main(String[] args){Customer customer = new Customer();customer.setPriceHandler(PriceHandlerFactory.createPriceHandler());Random rand = new Random();for(int i=1;i<=100;i++){System.out.print(i+":");customer.requestDiscount(rand.nextFloat());}}}

下面是根据自己的理解总结的责任链模式的类图:

我认为责任链模式的关键有两点:

1.父类中定义了后继(successor),每个子类创建对象时必须指定其后继对象(找好下家大笑),否则责任链就断了。

2.工厂类PriceHandlerFactory的createPriceHandler方法,除了要建立一条完整的责任链,还需要返回责任链的起始对象。

下一篇文章中,我们来结合mybatis理解一下责任链模式是如何应用到拦截器的实现中去的再见



0 0
原创粉丝点击