zoukankan      html  css  js  c++  java
  • JAVA设计模式《一》

      设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式软件工程的基石脉络,如同大厦的结构一样。

      本篇将为大家介绍JAVA中的设计模式的第一种:责任链模式。

      什么是责任链模式呢?举一个例子:由于目前的房价持续上涨,我们这群小青年,经过无数年打拼,总算攒够了买房的钱,于是乎你高高兴兴的来到售房处,准备买一套3居室,这是一位售楼小姐走过了问:先生你需要买房吗?你很高兴的对她说是的。经过精挑细选,你看中了一套,这是你对售楼小姐说,你能给我个5%的折扣吗?给的话立马全款。这是售楼小姐一想5%的折扣在我的决定权之内,于是乎她很高兴的说:好的先生,那您付款吧。第二天又来了一个买房的人,这个人呢?是个钻石王老五,他呢对售楼小姐说:给我10%的折扣我就买3套。售楼小姐一想,10%的折扣超出了我的权限范围,于是他就对王老五说:先生请稍等,我请示一下我们的经理。然后售楼小姐就找经理去了,把情况都报告给了经理,经理一想,10%的权限我有,于是对售楼小姐说可以。然后售楼小姐就回来对王老五说:先生我们经理已经同意给你10%的折扣,你到这边付一下款吧。讲到这里大家是不是已经对责任链有了一定的认识呢?下面我们就用代码具体实现一下这个过程。

     1、创建处理折扣处理人对象:

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

     2、创建一个销售类对象:

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

     3、创建一个销售经理对象:

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

     4、创建一个销售副总裁对象:

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

     5、创建一个销售总监对象:

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

     6、创建一个CEO对象:

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

     7、创建PriceHandler的工厂方法:

    public class PriceHandlerFactory {
    
        //创建PriceHandler的工厂方法
        public static PriceHandler createPriceHandler() {
            
            PriceHandler sales = new Sales();
            PriceHandler man = new Manager();
            PriceHandler dir = new Director();
            PriceHandler vp = new VicePresident();
            PriceHandler ceo = new CEO();
            
            sales.setSuccessor(man);
            man.setSuccessor(dir);
            dir.setSuccessor(vp);
            vp.setSuccessor(ceo);
            
            return sales;
        }
    
    }

     8、编写我们的测试类:  

    /*
     * 客户,请求折扣
     */
    public class Customer {
        
        private static 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 random = new Random();
            for(int i = 0; i<=100; i++){
                System.out.print(i+":");
                customer.requestDiscount(random.nextFloat());
            }
        }
        
    }

     9、代码运行测试:

     

     10、添加销售小组长对象:

    /*
     * 销售小组长拥有15%的批准权限
     */
    public class Group extends PriceHandler {
    
        public void processDiscount(float discount) {
            if(discount < 0.15){
                System.out.println("销售小组长长批准");
            }else{
                successor.processDiscount(discount);
            }
        }
    
    }

     11、把小组长添加到责任链中:

    public class PriceHandlerFactory {
    
        //创建PriceHandler的工厂方法
        public static PriceHandler createPriceHandler() {
            
            PriceHandler sales = new Sales();
            
            //创建销售小组长对象
            PriceHandler group = new Group();
            
            PriceHandler man = new Manager();
            PriceHandler dir = new Director();
            PriceHandler vp = new VicePresident();
            PriceHandler ceo = new CEO();
            
            sales.setSuccessor(group);
            
            //把销售小组长添加到责任链当中
            group.setSuccessor(man);
            
            man.setSuccessor(dir);
            dir.setSuccessor(vp);
            vp.setSuccessor(ceo);
            
            return sales;
        }
    
    }

     12、代码测试:

      

      对于责任链模式,就为大家介绍完毕。下一篇:单例模式与模板方法模式

  • 相关阅读:
    SharePoint 2013 配置基于表单的身份认证
    SharePoint 2013 场解决方案包含第三方程序集
    SharePoint 2010 站点附加数据升级到SP2013
    SharePoint 2013 在母版页中插入WebPart
    SharePoint 2013 搭建负载均衡(NLB)
    SharePoint 部署解决方案Feature ID冲突
    SharePoint 2013 配置基于AD的Form认证
    SharePoint Server 2016 Update
    SharePoint 2013 为用户组自定义EventReceiver
    SharePoint 2013 JavaScript API 记录
  • 原文地址:https://www.cnblogs.com/AndroidJotting/p/4355394.html
Copyright © 2011-2022 走看看