责任链模式(Chain of Responsibility)----行为笔记

来源:互联网 发布:淘宝上能买洋酒么 编辑:程序博客网 时间:2024/04/27 16:04

责任链模式(Chain of Responsibility----行为笔记

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

 

一、涉及对象

抽象处理者(Handler):定义一个处理请求的接口;(接口、抽象类)

具体处理者(ConcreteHandler)在接到请求后,可以选择将请求处理掉,或者将请求传给下家。持有对下家的引用。

Client提交请求。

 

二、何时适用

有多个处理者对象处理一个请求,哪个对象处理该请求运行时刻自动确定。

在不明确指定接收者的情况下,向多个对象中的一个提交一个请求,

处理一个请求的处理者对象集合需要动态指定时

 

注意:一个请求可能到了链的末端都得不到处理,或者因为没有正确配置,而得不到处理。

 

三、故事说明

CHAIN OF RESPONSIBLEITY—晚上去上英语课,为了好开溜坐到了最后一排,哇,前面坐了好几个漂亮的MM哎,找张纸条,写上“Hi,可以做我的女朋友吗?如果不愿意请向前传”,纸条就一个接一个的传上去了,糟糕,传到第一排的MM把纸条传给老师了,听说是个老处女呀,快跑!

 

责任链模式:在责任链模式中,很多对象由每一个对象对其下家的引用而接

 

起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求,系统可以在不影响客户端的情况下动态的重新组织链和分配责任。处理者有两个选择:承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。

 

 

 

抽象处理者(Handler):

public abstract class Handler {Handler nextHandler;public abstract void handleRequest(Request request);public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}}


具体处理者A(ConcreteHandler):

public class ConcreteHandlerA extends Handler {public void handleRequest(Request request) {if(request.getType() == 1){ System.out.println("HandlerA处理了:" + request.getType());}else if(null != nextHandler){nextHandler.handleRequest(request);}else{ System.out.println("无处理:" + request.getType());}}}


具体处理者B(ConcreteHandler):

public class ConcreteHandlerB  extends Handler {public void handleRequest(Request request) {  System.out.println("HandlerB处理了:" + request.getType()); }}


请求(可替代)

public class Request {int type;public int getType() {return type;}public void setType(int type) {this.type = type;}}


 

public class Client {public static void main(String[] args) {Handler handlerA = new ConcreteHandlerA();Handler handlerB = new ConcreteHandlerB();handlerA.setNextHandler(handlerB);Request request = new Request();request.setType(1);handlerA.handleRequest(request);System.out.println("----------分割不同请求-------------");Request request2 = new Request();request2.setType(2);handlerA.handleRequest(request2);}/*  HandlerA处理了:1----------分割不同请求-------------HandlerB处理了:2*/}


 

 

原创粉丝点击