• GoF23种设计模式之行为型模式之责任链模式


    一、概述

            使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止。其设计思想是:给对多个对象处理一个请求的机会,从而解耦请求发送者和接收者。

    二、适用性

    1.有多个对象可以处理一个请求,到底是哪个对象处理请求,交由运行时刻自动确定的时候。

    2.你想在不明确指定接收者的情况下,向多个对象中的一个发送请求的时候。

    3.可以处理一个请求的对象集合应该被动态指定的时候。

    三、参与者

    1.Handler:定义一个处理请求的接口。可能的话实现后继链(option)。

    2.ConcreteHandler:链上的具体处理者。处理它负责的请求。可以访问它的后继。如果可以处理该请求,就处理;否则将该请求转发给其后继。

    3.Client:向链上的具体处理者对象提交请求。

    四、类图

    五、示例

    Handler

    [java] view plain copy
     
     print?
    1. package cn.lynn.chainofresponsibility;  
    2.   
    3. public interface IRequestHandler {  
    4.   
    5.     public void handleRequest(IRequest request);  
    6.   
    7. }  
    ConcreteHandler
    [java] view plain copy
     
     print?
    1. package cn.lynn.chainofresponsibility;  
    2.   
    3. public class SunRequestHandler implements IRequestHandler {  
    4.   
    5.     @Override  
    6.     public void handleRequest(IRequest request) {  
    7.         if(request instanceof FightRequest) {  
    8.             System.out.println("悟空火眼金睛,三打白骨精!");  
    9.         }  
    10.     }  
    11.   
    12. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.chainofresponsibility;  
    2.   
    3. public class ZhuRequestHandler implements IRequestHandler {  
    4.     private IRequestHandler handler;  
    5.       
    6.     public ZhuRequestHandler(IRequestHandler handler) {  
    7.         this.handler = handler;  
    8.     }   
    9.   
    10.     @Override  
    11.     public void handleRequest(IRequest request) {  
    12.         if(request instanceof PeepRequest) {  
    13.             System.out.println("八戒偷窥嫦娥,被贬下凡!");  
    14.         }  
    15.         handler.handleRequest(request);  
    16.     }  
    17.   
    18. }  
    [java] view plain copy
     
     print?
    1. package cn.lynn.chainofresponsibility;  
    2.   
    3. public class ShaRequestHandler implements IRequestHandler {  
    4.   
    5.     private IRequestHandler handler;  
    6.       
    7.     public ShaRequestHandler(IRequestHandler handler) {  
    8.         this.handler = handler;  
    9.     }   
    10.       
    11.     @Override  
    12.     public void handleRequest(IRequest request) {  
    13.         if(request instanceof FindRequest) {  
    14.             System.out.println("师傅让妖怪抓走了,沙增找不到!");  
    15.         }  
    16.         handler.handleRequest(request);  
    17.     }  
    18.   
    19. }  
    Client
    [java] view plain copy
     
     print?
    1. package cn.lynn.chainofresponsibility;  
    2.   
    3. public class Client {  
    4.   
    5.     public static void main(String[] args) {  
    6.         IRequestHandler sun = new SunRequestHandler();  
    7.         IRequestHandler zhu = new ZhuRequestHandler(sun);  
    8.         IRequestHandler sha = new ShaRequestHandler(zhu);  
    9.           
    10.         IRequest request = new FindRequest();  
    11.         sha.handleRequest(request);  
    12.           
    13.         request = new PeepRequest();  
    14.         zhu.handleRequest(request);  
    15.           
    16.         request = new FightRequest();  
    17.         sun.handleRequest(request);  
    18.     }  
    19.   
    20. }  
    Result
    [java] view plain copy
     
     print?
    1. 师傅让妖怪抓走了,沙增找不到!  
    2. 八戒偷窥嫦娥,被贬下凡!  
    3. 悟空火眼金睛,三打白骨精!  
     
     
  • 相关阅读:
    快速提交一个项目到github或gitee上
    微信web开发问题记录
    解决 VUE项目过大nodejs内存溢出问题
    vue使用动态渲染v-model输入框无法输入内容
    webstorm 支持vue element-ui 语法高亮属性自动补全
    spring websocket报错:No matching message handler methods.
    Failed to start bean 'stompBrokerRelayMessageHandler'; nested exception is java.lang.NoClassDefFoundError: reactor/io/codec/Codec
    远程调用appium server
    appium 特殊操作
    mac下搭建appium
  • 原文地址:https://www.cnblogs.com/huangwentian/p/7471500.html
Copyright © 2020-2023  润新知