`

责任链完全理解

阅读更多
责任链(Chain of Responsibility)模式
责任链模式是一种对象行为模式。
在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。

责任链模式的角色:
1、抽象处理者角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由
   一个java抽象类或者java接口实现。
 
2、具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家,由于具体处理者持有对下家的引用,因此
   ,如果需要,具体处理者可以访问下家。
Java代码  收藏代码

   
//抽象处理者  
            public abstract class Hander{  
                //处理方法,调用此方法处理请求  
                protected Handle successor;  
                public abstract void handleRequest();  
                  
                //调用此方法,设定下家  
                public void setSuccessor(Handler successor){  
                    this.successor = successor;  
                }  
                  
                public Handler getSuccessor(){  
                    return successor;  
                }  
            }     
              
            //具体处理者  
            public class ConcreteHandler extends Handler{  
                public void handlerRequest(){  
                    if(getSuccessor() != null){  
                        System.out.println("The request is passed to " + getSuccessor());  
                        getSuccessor().handlerRequest();  
                    }else{  
                        System.out.println("The request is handled here.");  
                    }     
                }  
            }  
              
            //客户端  
            public class Client{  
                private static Handler handler1, handler2;  
                  
                public static void main(String args[]){  
                    handler1 = new ConcreteHandler();  
                    handler2 = new ConcreteHandler();  
                    handler1.setSuccessor(handler2);  
                    handler1.handleRequest();  
                }  
            }  

         



纯的与不纯的责任链模式
一个纯的责任链模式要求一个具体的处理者对象只能在两个行为中选择一个:一是承担责任,二是把责任推给下家。
不允许出现某一个具体处理者对象在承担了一部分责任后又把责任向下传的情况。

在一个纯的责任链模式里面,一个请求必须被某一个处理者对象所接受,在一个不纯的责任链模式里面,一个请求可以最终不被
任何接受端对象所接收。
Java代码  收藏代码

  
 //一个贾家击鼓传花喝酒的例子  
            //击鼓者(客户端)  
            public class DrumBeater{  
                private static Player player;  
                  
                public static void main(String[] args){  
                    //创建责任链  
                    player  = new JiaMu(new JiaShe(new JiaZheng(new JiaBaoYu(new JiaHuan(null)))));  
                      
                    //规定由第四个处理者处理请求  
                    player.handler(4);  
                }  
            }  
                 
            抽象传花者  
            public abstract class Player{  
                public abstract void handler(int i);  
                  
                private Player successor;  
                  
                public Player(){  
                    successor = null;  
                }  
                  
                protected void setSuccessor(Player aSuccessor){  
                    successor = aSuccessor;  
                }  
                  
                //将花传给下家,如果没有下家,系统停止运行  
                public void next(int index){  
                    //判断下家对象是否有效  
                    if(successor != null){  
                        //将请求传给下家  
                        successor.handler(index);  
                    }else{  
                        //系统停止运行  
                        System.out.println("Program terminated.");  
                        System.exit(0);  
                    }  
                }  
            }    
              
            //JiaMu类  
            public class JiaMu extends Player{  
                public JiaMu(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handler(int i){  
                    if(i == 1){  
                        System.out.println("Jia Mu gotta drink!");  
                    }else{  
                        System.out.println("JiaMu passed!");  
                        next(i);  
                    }  
                }  
            }  
              
            //JiaShe  
              
            public class JiaShe extends Player{  
                public JiaShe(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handler(int i){  
                    if(i == 2){  
                        System.out.println("Jia She gotta drink!");  
                    }else{  
                        System.out.println("Jia She passed!");  
                        next(i);  
                    }  
                }  
            }  
              
            public class JiaZheng extends Player{  
                public JiaZheng(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handler(int i){  
                    if(i == 3){  
                        System.out.println("Jia Zheng gotta drink!");  
                    }else{  
                        System.out.println("Jia Zheng passed!");  
                        next(i);  
                    }  
                }  
            }  
              
            public class JiaBaoYu extends Player{  
                public JiaBaoYu(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handler(int i){  
                    if(i == 4){  
                        System.out.println("Jia Bao Yu gotta drink!");  
                    }else{  
                        System.out.println("Jia Bao Yu passed!");  
                        next(i);  
                    }  
                }  
            }  
              
            public class JiaHuan extends Player{  
                public JiaHuan(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handler(int i){  
                    if(i == 5){  
                        System.out.println("Jia Huan gotta drink!");  
                    }else{  
                        System.out.println("Jia Huan passed!");  
                        next(i);  
                    }  
                }  
            }  




在下面的情况下可以使用责任链模式:
(1)系统已经有一个由处理者对象组成的链。这个链可能由合成模式给出。
(2)有多于一个的处理者对象会处理一个请求,而且事先并不知道到底由哪一处理者对象处理一个请求。
     这个处理者对象是动态确定的。
(3)系统想发出一个请求给多个处理者对象中的某一个,但是不明显指定是哪一个处理者对象会处理此请求。
(4)处理一个请求的处理者对象的集合需要动态地指定时。
责任链模式降低了发出命令的对象和处理命令的对象之间的耦合,它允许多于一个的处理者对象根据自己的逻辑来决定
哪一个处理者最终处理这个命令。换言之,发出命令的对象只是把命令传给链结构的起始者,而不需要知道到底是链上
的哪一个节点处理了这个命令。

显然。这意味着在处理命令时,允许系统有更多的灵活性。哪一个对象最终处理一个命令可以因为由哪些对象参加责任链,
以及这些对象在责任链上的位置不同而有所不同。

Java代码  收藏代码

 
  //一个使用Timer的例子  
            import java.util.Timer;  
            import java.util.TimerTask;  
            public class Reminder{  
                Timer timer;  
                //构造子,在seconds秒后执行一个任务  
                public Reminder(int seconds){  
                    timer = new Timer();  
                    timer.schedule(new RemindTask(),seconds*1000);  //schedule(清单,目录)  
                }  
                  
                //内部成员类,描述将要执行的任务  
                class RemindTask extends TimerTask{  
                    public void run(){  
                        System.out.println("Time's up!");  
                        timer.cancle();  
                    }  
                }  
                  
                public static void main(String[] args){  
                    System.out.println("About to schedule task.");  
                    new Reminder(5);  
                    System.out.println("Task scheduled.");  
                }  
                  
            }  
            //Timer类是线程安全的,换言之,可以有多个线程共享同一个Timer对象,而不需要同步化。这是使用Timer的一个好处。  
                 
            //击鼓者(相当于客户端)  
            import java.lang.Thread;  
            import java.util.Timer;  
            import java.util.TimerTask;  
              
            public class DrumBeater{  
                private static Player firstPlayer;  
                public static boolean stopped = false;  
                Timer timer;  
                  
                public static void main(String[] args){  
                  
                    DrumBeater drumBeater = new DrumBeater();  
                    JiaMu jiaMu = new JiaMu(null);  
                    JiaMu.setSuccessor(new JiaShe(new JiaZheng(new JiaBaoYu(new JiaHuan(jiaMu)))));  
                      
                    //开始击鼓过程  
                    drumBeater.startBeating(1);  
                    //由贾母开始传花  
                    firstPlayer = jiaMu;  
                    firstPlayer.handle();  
                }  
                  
                //调用下面方法,开始击鼓过程  
                public void startBeating(int stopInSeconds){  
                    System.out.println("Drum beating started...");  
                    timer = new Timer();  
                    timer.schedule(new StopBeatingReminder(),stopInSeconds*1000);  
                }  
                  
                //内部成员类,描述停止击鼓的任务  
                class StopBeatingReminder extends TimerTask{  
                    public void run(){  
                        System.out.println("Drum beating stopped!");  
                        stopped = true;  
                        timer.cancel();  
                    }  
                }  
            }     
              
            //抽象传花者类  
            public abstract class Player{  
                public abstract void handle();  
                  
                private Player successor;  
                  
                public Player(){  
                    successor = null;  
                }  
                  
                protected void setSuccessor(Player aSuccessor){  
                    successor = aSuccessor;  
                }  
                  
                public void next(){  
                    //判断下家对象是否有效  
                    if(successor != null){  
                        //将请求传给下家  
                        successor.handle();  
                    }else{  
                        //系统停止运行  
                        System.out.println("Program is terminating.");  
                        System.exit(0);  
                    }  
                }  
            }  
              
            //贾母  
            public class JiaMu extends Player{  
                public JiaMu(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handle(){  
                    //检查是否击鼓已经停止]  
                    if(DrumBeater.stopped){  
                        System.out.pritntln("Jia Mu gotta drink!");  
                    }else{  
                        System.out.println("Jia Mu passed!");  
                        next();  
                    }  
                }  
            }  
            ......................  
            public class JiaHuan extends Player{  
                public JiaHuan(Player aSuccessor){  
                    this.setSuccessor(aSuccessor);  
                }  
                  
                public void handle(){  
                    //检查是否击鼓已经停止]  
                    if(DrumBeater.stopped){  
                        System.out.println("Jia Huan gotta drink!");  
                    }else{  
                        System.out.println("Jia Huan passed!");  
                        next();  
                    }  
                }  
            }  
分享到:
评论

相关推荐

    深入浅出JAVA责任链模式

    ### 深入浅出JAVA责任链模式 #### 一、引言 责任链模式是一种在软件设计领域中常见的设计模式之一,它主要用于处理请求的传递过程,...通过对责任链模式的理解和应用,可以使我们的代码更加优雅、灵活且易于维护。

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    学习这些示例,你可以更深入地理解Spring AOP的工作原理,掌握如何使用动态代理和责任链模式来编写切面,以及如何通过注解简化AOP的配置和使用。这些知识对于任何涉及Spring框架的开发者来说都是至关重要的,因为...

    PHP设计模式之责任链模式的深入解析

    责任链模式(Chain of Responsibility)是一种行为设计模式,它的核心思想是将多个处理请求的对象链接成一条链,每个对象称为处理者...通过理解并恰当使用责任链模式,开发者可以构建出更灵活、可维护的PHP应用程序。

    供应链研究现状综述

    供应链的概念自20世纪80年代提出以来,经过了几十年的发展,虽然没有形成一个完全统一的定义,但其核心理念已经被广泛接受。Lin F.R.等人指出供应链是由供应商、制造商、销售商等组成的网络系统,涉及到物流、资金流...

    供应链十大特点.docx

    6. **供应链对可持续发展负有责任**:从源头到终端,供应链的每一个环节都与环保紧密相连,推动可持续发展已成为供应链管理的重要任务。 7. **“供应链”名称的局限性**:供应链这一术语并不能完全概括其复杂性和...

    供应链管理复习重点.pdf

    总的来说,供应链管理复习的重点在于理解和应用各种理论、模型和策略,以提升整个供应链的效率、灵活性和适应性,同时关注环境和社会责任。在互联网时代,这些知识对于任何与供应链相关的行业和企业来说都是必不可少...

    网络会议的法律责任浅析网络服务提供者的法律责任.pdf

    【网络会议的法律责任浅析网络服务提供者的法律...通过理解过错责任原则,判断网络服务提供者的注意义务,以及法律规定的实施,我们能够更好地应对网络侵权现象,保护各方的合法权益,同时促进互联网行业的繁荣与创新。

    第5章供应链合作伙伴关系的建立与评价.pptx

    通过理解和应用这些理论,企业可以更好地构建和维护供应链战略合作伙伴关系,以实现共赢和可持续发展。在实践中,企业应重视长期合作,克服短期行为,提升信息共享水平,以适应不断变化的市场环境。同时,对合作伙伴...

    台湾供应链整合效率讲解.pptx

    半导体产业分为设计、制造和封装测试三个阶段,每个阶段都有其特定的角色和责任。 3D IC技术的出现是为了解决传统二维系统芯片和系统封装的空间限制,通过硅通孔(TSV)技术实现三维堆叠,以提高集成度和效能。这种...

    供应链战略合作伙伴关系及其选择研究.pptx

    企业会与供应商分享生产计划、经营策略,确保供应商能够准确理解并满足企业的需求,双方在责任上相互负责,共同追求双赢目标。 供应链战略合作伙伴关系的发展经历了传统关系、物流关系、合作伙伴关系以及网络资源...

    莫泊桑《项链》优秀(教案).doc

    在教学过程中,教师可以引导学生探讨玛蒂尔德的悲剧是否完全可以避免,以及在现代社会中是否仍能找到类似的现象。通过对玛蒂尔德的评价,学生们可以反思个人欲望与社会责任之间的平衡,以及物质追求对人生价值的影响...

    完全女人美学馆加盟合同.zip

    在商业领域,加盟合同是特许经营商(即“完全女人美学馆”)与加盟商之间的重要法律文件,用于明确双方的权利、义务、责任以及合作细节。 【描述】:“合同模板,可参考使用,欢迎下载”说明这个文档是供人们参考和...

    大数据价值链视角下政府审计问题及对策研究.docx

    在政府审计领域,大数据价值链的应用可以帮助审计机构更好地理解数据背后的模式和关联性,从而实现更精确的预测和决策支持。 全国大数据标准工作组发布的《大数据白皮书》中提出了一个包含两大价值链维度(IT价值链...

    沃尔玛社会责任验厂-消防安全.ppt

    《沃尔玛社会责任验厂-消防安全.ppt》是一份针对沃尔玛供应链中的供应商、工厂及审核员的消防安全培训课程资料,旨在确保所有参与者对沃尔玛供应商守则中关于消防安全的规定有深入理解和实施。该课程单元在2015年3月...

    组策略完全手册1

    委派权限允许管理员将部分管理责任分配给其他用户或组,提高管理效率;强制策略则可以确保即使用户尝试更改设置,也会被策略覆盖;策略冲突则可能出现在多GPO环境中,解决冲突需要合理规划和排序GPO的链接顺序。 ...

    shiro反序列化attack

    除非您已充分阅读、完全理解并接受本协议所有条款,否则,请您不要安装并使用本工具。 您的使用行为或者您以其他任何明示或者默示方式表示接受本协议的,即视为您已阅读并同意本协议的约束” 有完善的cc链cb链等,...

    供应链管理丨年度降本指标,该怎么完成.pdf

    不应将降价责任完全归于采购部门,而是需要公司各层级共同参与,整合资源、信息和能力。各部门的合作可以带来更有效的谈判策略,比如共享市场情报,协同供应商管理,甚至通过改进设计和生产流程来降低物料需求。 ...

    电子商务环境下企业农产品供应链管理的信息不对称理论.pptx

    因此,理解并解决电商环境下的信息不对称问题对于提高农产品供应链的效率、保障食品安全、增强消费者信心至关重要。 为了应对这一挑战,企业可以采取以下策略:一是建立和完善信息披露机制,通过电子平台透明化供应...

    沃尔玛社会责任验厂消防安全.pptx

    【沃尔玛社会责任验厂消防安全】是沃尔玛对供应商和工厂进行的一项重要培训内容,旨在确保供应链的安全性和合规性,尤其是消防安全方面。这份2015年3月更新的PPT旨在为供应商、工厂和审核员提供消防安全培训课程,以...

    2022年5月采购与供应链案例宣贯.pdf

    对供应市场进行分析,理解市场结构,如完全竞争、寡头或垄断竞争市场。确定潜在供应商后,要评估他们的能力,如生产能力、管理、财务状况和成本结构。通过招标和谈判选择供应商,准备订单,进行收货和验收,然后开具...

Global site tag (gtag.js) - Google Analytics