• 设计模式之——Chain of Responsibility


    Chain of Responsibility模式又叫做责任链模式,是将多个对象组成一条职责链,然后按照职责链上的顺序一个一个的找出是谁来负责处理。

    这个模式很简单,下面就是一个实例程序,有六个处理器,能分别处理一些六个级别的问题,现在有一堆问题在那,那么我们就把处理器进行串行连接,依次将问题通过,如果是自己的那就处理,不是自己的那就不处理,让下一个处理器处理,最后都没处理器处理的就直接输出,控制台打印没处理器处理。

    • Trouble问题的类
    package site.wangxin520.gof.chain;
    
    /**
     * 责任链模式的问题 在责任链处理的过程中,将问题传入责任链中,在符合要求的责任链中进行操作
     * 
     * @author wangXgnaw
     *
     */
    public class Trouble {
    
        // 级别
        private int number;
    
        // 问题名字
        private String name;
    
        /**
         * 传入问题的级别和名字
         * 
         * @param number
         * @param name
         */
        public Trouble(int number, String name) {
            super();
            this.number = number;
            this.name = name;
        }
    
        public int getNumber() {
            return number;
        }
    
        public void setNumber(int number) {
            this.number = number;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
    }
    • Chain处理器的父类
    package site.wangxin520.gof.chain;
    
    /**
     * 责任链的抽象类 定义了责任链的规范和方法
     * 
     * @author wangXgnaw
     *
     */
    public abstract class Chain {
    
        // 定义责任链的名字
        private String name;
    
        // 下一个责任链
        private Chain next;
    
        /**
         * 构造方法,责任链的构造
         * @param name
         */
        public Chain(String name) {
            this.name=name;
        }
    
        /**
         * 这个是重点,设置责任链下一个责任人,并且返回下一个责任人。
         * 这个样子就可以使用链式编程的方式进行操作。
         * @param next
         * @return
         */
        public Chain setNextChain(Chain next){
            this.next=next;
            return next;
        }
        
        /**
         * 这个方法是规定了子类实现的方法,用于解决问题
         * @param trouble 传入问题
         * @return boolean 返回是否解决成功
         */
        protected abstract boolean solveProblem(Trouble trouble);
        
        /**
         * 解决问题的方法,传入问题
         * @param trouble
         */
        public void solve(Trouble trouble){
            if(solveProblem(trouble)){
                System.out.println(name+"把"+trouble.getName()+trouble.getNumber()+"级别的问题解决了");
            }else if(null ==next){
                System.out.println(trouble.getName()+"这个问题解决不了!");
            }else{
                next.solve(trouble);
            }
        }
        
    }
    • 处理器,这里只列举了处理器1,其他的都一样
    package site.wangxin520.gof.chain;
    
    /**
     * 解决一级问题
     * @author wangXgnaw
     *
     */
    public class Chain1 extends Chain{
    
        public Chain1(String name) {
            super(name);
        }
    
        @Override
        protected boolean solveProblem(Trouble trouble) {
            if(trouble.getNumber()==1){
                return true;
            }
            return false;
        }
    
    }
    • 测试类
    package site.wangxin520.gof.chain;
    
    import java.util.Random;
    
    /**
     * 责任链模式的测试
     * 
     * @author wangXgnaw
     *
     */
    public class Test {
    
        public static void main(String[] args) {
    
            //新建一些处理器
            Chain1 chain1 = new Chain1("处理器1");
            Chain2 chain2 = new Chain2("处理器2");
            Chain3 chain3 = new Chain3("处理器3");
            Chain4 chain4 = new Chain4("处理器4");
            Chain5 chain5 = new Chain5("处理器5");
            Chain6 chain6 = new Chain6("处理器6");
    
            //设置各个处理器之间的链关系,这里注意的是,不要弄成环,只要是链就行
            chain1.setNextChain(chain2).setNextChain(chain3).setNextChain(chain4).setNextChain(chain5).setNextChain(chain6);
    
            Random r=new Random();
            
            //设置是个问题,让处理器1去执行,如果1执行不了的话,就会自动找到下一个处理器2执行依次下去。。。
            for (int i = 0; i <10; i++) {
                int num=r.nextInt(10)+1;
                Trouble trouble = new Trouble(num, "问题"+(i+1)+"号");
                chain1.solve(trouble);
            }
            
        }
    }
    • 控制台输出

    image

    由控制台可以看出,问题一号一直被推脱给了六号处理器,问题2号还没有被解决……

    可见责任链模式还是很简单的!

  • 相关阅读:
    从左边或右边删除字符串-python 使用lstrip
    MapReduce- 学习9313第一节记录 材料源于百度百科
    138. (待解决)复制带随机指针的链表
    19. 删除链表的倒数第N个节点-链表(leetcode)
    347.前k个高频元素-counter(leetcode)
    python二进制、十进制、8进制、16进制转换(转)
    POJ 1715
    POJ 1306
    POJ 2436
    POJ 2249
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7712025.html
Copyright © 2020-2023  润新知