• Chain Of Responsibility


    职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合度。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

    接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互连接,它们仅需保持一个指向后继者的引用,而不需保持它所有的候选者的引用。

    随时可增加或修改处理一个请求的的结构。增强了给对象指派职责的灵活性。

     1 //定义一个处理请示接口
     2 public abstract class Handler {
     3 
     4     protected Handler successor;
     5     
     6     public void setSuccessor(Handler successor){
     7     this.successor = successor;
     8     }
     9     
    10     public abstract void handleRequest(int request);
    11     
    12 }
     1 //具体处理类,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理,否则将请求转发到它的后继者。
     2 class ConcreteHandler1 extends Handler {
     3 
     4     @Override
     5     public void handleRequest(int request) {
     6     //请求数在 0-10 之间有权处理,否则转到下一位
     7     if(request >=0 && request < 10){
     8         System.out.println("request - " + request);
     9         System.out.println("deal - " + ConcreteHandler1.class.getName());
    10     }else{
    11         successor.handleRequest(request);
    12     }
    13     }
    14     
    15 }
    16 
    17 class ConcreteHandler2 extends Handler {
    18 
    19     @Override
    20     public void handleRequest(int request) {
    21     //请求数在 10-20 之间有权处理,否则转到下一位
    22     if(request >= 10 && request < 20){
    23         System.out.println("request - " + request);
    24         System.out.println("deal - " + ConcreteHandler2.class.getName());
    25     }else{
    26         successor.handleRequest(request);
    27     }
    28     }
    29     
    30 }
    31 
    32 class ConcreteHandler3 extends Handler {
    33 
    34     @Override
    35     public void handleRequest(int request) {
    36     if(request >=20 && request < 30){
    37         System.out.println("request - " + request);
    38         System.out.println("deal - " + ConcreteHandler3.class.getName());
    39     }else{
    40         successor.handleRequest(request);
    41     }
    42     }
    43     
    44 }
     1 public static void main(String[] args) {
     2     Handler h1 = new ConcreteHandler1();
     3     Handler h2 = new ConcreteHandler2();
     4     Handler h3 = new ConcreteHandler3();
     5     
     6     //设置职责链的上家和下家
     7     h1.setSuccessor(h2);
     8     h2.setSuccessor(h3);
     9     h3.setSuccessor(h1);
    10     
    11     int[] requests = {1,5,15,20};
    12     
    13     for(int i : requests){
    14         h1.handleRequest(i);
    15     }
    16 }

    打印结果:

    request - 1
    deal - org.chain.ConcreteHandler1
    request - 5
    deal - org.chain.ConcreteHandler1
    request - 15
    deal - org.chain.ConcreteHandler2
    request - 20
    deal - org.chain.ConcreteHandler3

  • 相关阅读:
    【NX二次开发】一种NX自带的单线字体
    不点回车获取整数块的值
    Adobe 2022 全家桶重磅升级 王者归来 安装包都在这里 完全免费 无套路 干净卫生实用方便 赶紧全拿走吧!
    查看使用SYSAUX表空间的对象及占用大小
    linux DMA子系统学习总结(一) 串口DMA驱动实现分析
    linux arm32中断子系统学习总结(三) 软件子系统
    linux arm32中断子系统学习总结(二) 硬件原理
    linux arm32中断子系统学习总结(一) 预备知识
    indebounce解决ios在h5中的橡皮回弹问题
    gallery.echarts 新网站记录
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2614087.html
Copyright © 2020-2023  润新知