zoukankan      html  css  js  c++  java
  • 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());
            }
        }
    }
  • 相关阅读:
    Linux 下curl模拟Http 的get or post请求
    ShopNC学习笔记(转)
    (转) shopnc数据库操作
    Mysql开发规范
    长连接、短连接、长轮询和WebSocket
    一个支付宝没有安装app时看不到web网页,无法支付的问题
    MVVM设计模式
    c中的scanf和printf
    import和class关键字的区别
    oc中的注释
  • 原文地址:https://www.cnblogs.com/chengxuyuanzhilu/p/4691736.html
Copyright © 2011-2022 走看看