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. 悟空火眼金睛,三打白骨精!  
 
 
原文地址:https://www.cnblogs.com/huangwentian/p/7471500.html