首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

责任链方式 chain of responsibility(原)

2012-08-16 
责任链模式 chain of responsibility(原)动机:在开发过程中有一种情况:一个事件产生一个请求,这个请求需要

责任链模式 chain of responsibility(原)

动机:

在开发过程中有一种情况:一个事件产生一个请求,这个请求需要很多对象来处理它,更极端一点,我们不能直接访问这些对象。这种情况下我们有两种解决方案:

?????? 1、让这些对象变成public,创建这些对象的引用,然后处理这个请求

???????2、使用责任链模式

在责任链模式中,一组处理请求的对象构成一条链子,每个对象都可以处理请求而且持有下个对象的引用,请求从一个对象传递到下一个对象,直到处理完这个请求。

?

意义或者作用:

????? 1、避免请求发送者直接依赖所有接受者对象,达到解耦的目的。

????? 2、所有接受者对象都成为链的一部分,请求在这些对象中传递直到某个对象解决掉请求

?

使用场景或者条件:

????? 1、有多个handler可以处理一条命令

??????2、预先不知道哪个handler来处理,到底使用哪个handler应该由handler内部处理方法自动地确定

????? 3、请求应该发送到一组handler,而不是某个handler

?

UML结构图:

责任链方式 chain of responsibility(原)

Handler - defines an interface for handling requests RequestHandler - handles the requests it is responsible forIf it can handle the request it does so, otherwise it sends the request to its successor Client - sends commands to the first object in the chain that may handle the command

?

附上一个例子:

public class Request {private int m_value;private String m_description;public Request(String description, int value){m_description = description;m_value = value;}public int getValue(){return m_value;}public String getDescription(){return m_description;}          }public abstract class Handler{protected Handler m_successor;public void setSuccessor(Handler successor){m_successor = successor;}public abstract void handleRequest(Request request);}public class ConcreteHandlerOne extends Handler{public void handleRequest(Request request){if (request.getValue() < 0){           //if request is eligible handle itSystem.out.println("Negative values are handled by ConcreteHandlerOne:");System.out.println("\tConcreteHandlerOne.HandleRequest : " + request.getDescription() + request.getValue());}else{super.m_successor.handleRequest(request);}} }public class ConcreteHandlerThree extends Handler{public void handleRequest(Request request){if (request.getValue() >= 0){           //if request is eligible handle itSystem.out.println("Zero values are handled by ConcreteHandlerThree:");System.out.println("\tConcreteHandlerThree.HandleRequest : " + request.getDescription() + request.getValue());}        else{super.m_successor.handleRequest(request);}}}public class ConcreteHandlerTwo extends Handler{public void handleRequest(Request request){if (request.getValue() > 0){           //if request is eligible handle itSystem.out.println("Positive values are handled by ConcreteHandlerTwo:");System.out.println("\tConcreteHandlerTwo.HandleRequest : " + request.getDescription() + request.getValue());}        else{super.m_successor.handleRequest(request);}}}public class Main {public static void main(String[] args) {// Setup Chain of ResponsibilityHandler h1 = new ConcreteHandlerOne();Handler h2 = new ConcreteHandlerTwo();Handler h3 = new ConcreteHandlerThree();h1.setSuccessor(h2);h2.setSuccessor(h3);// Send requests to the chainh1.handleRequest(new Request("Negative Value ", -1));h1.handleRequest(new Request("Negative Value ",  0));h1.handleRequest(new Request("Negative Value ",  1));h1.handleRequest(new Request("Negative Value ",  2));h1.handleRequest(new Request("Negative Value ", -5));    }}

?

?

热点排行