zoukankan      html  css  js  c++  java
  • java设计模式(五)责任链模式

      很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等。

      要点:1)抽象处理者角色:定义处理请求接口及设定下家引用

            2)具体处理着角色:具体处理请求或选择将请求传给下家

    1、抽象处理者角色类,定义处理请求接口及下家引用

    public abstract class PriceHandle {
    
        protected PriceHandle successor;
    
        public void setSuccessor(PriceHandle successor) {
            this.successor = successor;
        }
    
        public abstract void process(float discount);
    
        public static PriceHandle createPriceHandle() {
            PriceHandle sales = new Sales();
            PriceHandle direct = new Direct();
            PriceHandle ceo = new CEO();
    
            sales.setSuccessor(direct);
            direct.setSuccessor(ceo);
            return sales;
        }
    }

    2、具体处理者角色类销售类

    public class Sales extends PriceHandle {
        public void process(float discount) {
            if(discount <= 0.1) {
                System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(), discount);
            } else {
                successor.process(discount);
            }
        }
    }

    3、具体处理者角色主管类

    public class Direct extends PriceHandle {
    
        public void process(float discount) {
            if(discount <= 0.2) {
                System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(), discount);
            } else {
                successor.process(discount);
            }
        }
    }

    4、具体处理者角色ceo类

    public class CEO extends PriceHandle {
        public void process(float discount) {
            if(discount <= 0.3) {
                System.out.format("%s批准了折扣:%.2f%n",this.getClass().getName(), discount);
            } else {
                System.out.format("%s拒绝了折扣:%.2f%n",this.getClass().getName(), discount);
            }
        }
    }

    5、测试类

    public class Model {
    
        private PriceHandle priceHandle;
    
        public void setPriceHandle(PriceHandle priceHandle) {
            this.priceHandle = priceHandle;
        }
    
        public void requestDiscount(float discount) {
            priceHandle.process(discount);
        }
    
        public static void main(String[] args) {
            Model customer = new Model();
            customer.setPriceHandle(PriceHandle.createPriceHandle());
            Random random = new Random();
            for(int i = 0; i < 100; i++) {
                System.out.print(i + ":");
                customer.requestDiscount(random.nextFloat());
            }
        }
    
    }
  • 相关阅读:
    obj,lib,dll,exe
    .net连接access数据库 关键字引起的 语句的语法错误
    XSS攻击与防御
    location.href和location.replace和location.reload的不同(location.replace不记录历史)
    C++中头文件包含问题
    SqlServerExpress2005 自动备份
    在SQL Server 的使用过程中,发现几个很有用,但不太常用
    双机镜像
    浅谈SQL Server identity列的操作方法
    镜像三机
  • 原文地址:https://www.cnblogs.com/sunjf/p/chain.html
Copyright © 2011-2022 走看看