Java实现责任链模式
责任链模式:
将接受者对象连成一条链,并在该链上传递请求,直到一个几首这对象处理它。通过让更多对象有机会处理请求,避免了请求发送者和接受者之间的耦合。
责任链模式的优缺点:
优点:高内聚,低耦合。业务变更,新增一级处理时,只需要新增一个类即可。符合我们开闭原则(扩展开发,变更关闭)。
缺点:时间,内存的效果相对较大。java的AWT对责任链模式的抛弃,去拥抱了观察者模式。
应用:
Java异常处理机制
JavaScript事件模型
JavaEE的Filter拦截器
SpringSecurity Spring安全框架
实例:
变更需求
实例代码:
类结构图
具体代码:
package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 价格处理人,负责处理客户折扣申请 */ public abstract class PriceHandler { //直接后继,用于传递请求 protected PriceHandler successor; public void setSuccessor(PriceHandler successor) { this.successor = successor; } /* * 处理折扣申请 */ public abstract void processDiscount(float discount); } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 销售,可以批准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); } } } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 业务扩展,管理需要细分,新增以及销售层销售组长 * 销售小组长,可以批准15%以内的折扣 */ public class Lead extends Sales{ @Override public void processDiscount(float discount) { if(discount <= 0.15){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 销售经理,可以批准30%以内的折扣 */ public class Manager extends Lead { @Override public void processDiscount(float discount) { if(discount <= 0.30){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 销售总监,可以批准40%以内的折扣 */ public class Director extends Manager { @Override public void processDiscount(float discount) { if(discount <= 0.40){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 副总,可以批准50%以内的折扣 */ public class VicePresident extends Director { @Override public void processDiscount(float discount) { if(discount <= 0.50){ System.out.format("%s批准了折扣:%2f%n",this.getClass().getName(),discount); }else{ successor.processDiscount(discount); } } } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * CEO,可以批准55%以内的折扣,可以拒绝高于55%的折扣 */ public class CEO extends Manager { @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); } } } package chengxuyuanzhilu.com.cor.handler; /** * @author 微信公众号:程序员之路 * 创建价格处理者工厂 */ public class PriceHandleFactory { /* * 工程模式创建价格处理者 */ public static PriceHandler createPriceHandler() { //向上转型 PriceHandler sales = new Sales(); PriceHandler lead = new Lead();//业务变更 PriceHandler manager = new Manager(); PriceHandler director = new Director(); PriceHandler vicePresident = new VicePresident(); PriceHandler ceo = new CEO(); //指定后继销售者 sales.setSuccessor(lead); lead.setSuccessor(manager);//业务变更 manager.setSuccessor(director); director.setSuccessor(vicePresident); vicePresident.setSuccessor(ceo); return sales; } } package chengxuyuanzhilu.com.cor; import java.util.Random; import chengxuyuanzhilu.com.cor.handler.PriceHandleFactory; import chengxuyuanzhilu.com.cor.handler.PriceHandler; /** * @author 微信公众号:程序员之路 * 客户,请求折扣 */ 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(PriceHandleFactory.createPriceHandler()); Random rand = new Random(); for(int i=1;i<100;i++){ System.out.println(i+":"); customer.requestDiscount(rand.nextFloat()); } } }