设计模式之责任链模式

来源:互联网 发布:php获取今天是星期几 编辑:程序博客网 时间:2024/05/29 14:31

一、概述

责任链模式属于行为型模式的一种,从字面上可理解为由多个节点对象所形成的一条链,每个节点对象拥有相同的结构,并拥有指向下一个处理事件的节点对象的引用,使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系,这些处理请求的对象按一定的顺序形成一条链,并沿着这条链处理请求,直到该事件被消费了为止。



二、应用场景

当一个请求发生时,有多个对象可以接收并处理该请求,当无非消费该请求时,则传递给下一处理请求的对象,在android中的点击事件分发机制也是属于责任链模式,viewgroup接收到点击事件后分发给子view,下一级的子view如果没有消费该事件即onTouchEvent中返回了false,则继续把事件传递给下一级的子view,直到有子view消费了该事件为止。现实生活中也有同样的例子,有时你需要查看一些公司的文档,但是权限不够,你就去找你的直系领导,你的直系领导权限不够就再继续向上一级发出查看该文档的请求,直到有足够权限的领导批准并把文档给了你则该请求处理完毕,你也可以不用一层层的往上传递该请求,可以越级直接把该请求发送给足够权限的领导处理。

三、简单示例

/* * 抽象处理者 */public abstract class Handler {//下一处理者节点    protected Handler nextHandler;    public abstract void handleRequest(int request);    public abstract int getLevel();}

/* * 具体的请求处理者1 */public class ConcreteHandler1 extends Handler{@Overridepublic void handleRequest(int request) {// TODO Auto-generated method stubif (request == getLevel()) {System.out.println("have handled");} else {nextHandler.handleRequest(request);}}@Overridepublic int getLevel() {// TODO Auto-generated method stubreturn 1;}}

/* * 具体的请求处理者2 */public class ConcreteHandler2 extends Handler{@Overridepublic void handleRequest(int request) {// TODO Auto-generated method stubif (request == getLevel()) {System.out.println("have handled");} else {nextHandler.handleRequest(request);}}@Overridepublic int getLevel() {// TODO Auto-generated method stubreturn 2;}}
public class RequestClient {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub         ConcreteHandler1 handler1 = new ConcreteHandler1();         ConcreteHandler2 handler2 = new ConcreteHandler2();         handler1.nextHandler = handler2;         handler2.nextHandler = handler1;         handler1.handleRequest(1);}}



0 0