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

一、概述

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

二、适用性

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

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

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

三、参与者

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

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

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

四、类图

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

五、示例

Handler

  1. package cn.lynn.chainofresponsibility;
  2. public interface IRequestHandler {
  3. public void handleRequest(IRequest request);
  4. }

ConcreteHandler

  1. package cn.lynn.chainofresponsibility;
  2. public class SunRequestHandler implements IRequestHandler {
  3. @Override
  4. public void handleRequest(IRequest request) {
  5. if(request instanceof FightRequest) {
  6. System.out.println("悟空火眼金睛,三打白骨精!");
  7. }
  8. }
  9. }
  1. package cn.lynn.chainofresponsibility;
  2. public class ZhuRequestHandler implements IRequestHandler {
  3. private IRequestHandler handler;
  4. public ZhuRequestHandler(IRequestHandler handler) {
  5. this.handler = handler;
  6. }
  7. @Override
  8. public void handleRequest(IRequest request) {
  9. if(request instanceof PeepRequest) {
  10. System.out.println("八戒偷窥嫦娥,被贬下凡!");
  11. }
  12. handler.handleRequest(request);
  13. }
  14. }
  1. package cn.lynn.chainofresponsibility;
  2. public class ShaRequestHandler implements IRequestHandler {
  3. private IRequestHandler handler;
  4. public ShaRequestHandler(IRequestHandler handler) {
  5. this.handler = handler;
  6. }
  7. @Override
  8. public void handleRequest(IRequest request) {
  9. if(request instanceof FindRequest) {
  10. System.out.println("师傅让妖怪抓走了,沙增找不到!");
  11. }
  12. handler.handleRequest(request);
  13. }
  14. }

Client

  1. package cn.lynn.chainofresponsibility;
  2. public class Client {
  3. public static void main(String[] args) {
  4. IRequestHandler sun = new SunRequestHandler();
  5. IRequestHandler zhu = new ZhuRequestHandler(sun);
  6. IRequestHandler sha = new ShaRequestHandler(zhu);
  7. IRequest request = new FindRequest();
  8. sha.handleRequest(request);
  9. request = new PeepRequest();
  10. zhu.handleRequest(request);
  11. request = new FightRequest();
  12. sun.handleRequest(request);
  13. }
  14. }

Result

  1. 师傅让妖怪抓走了,沙增找不到!
  2. 八戒偷窥嫦娥,被贬下凡!
  3. 悟空火眼金睛,三打白骨精!
 
 
上一篇:[C++]Infinite House of Pancakes——Google Code Jam 2015 Qualification Round


下一篇:Google Code Jam 2009 Qualification Round Problem C. Welcome to Code Jam