责任链模式
2020-10-26 19:27:53 0 举报
责任链模式
作者其他创作
大纲/内容
==责任链模式(对象行为模式)==避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。==角色== Handler(抽象处理者):它定义了处理请求的接口,一般设计成抽象类,持有一个处理器的引用,如果自己无法处理请求则转给下一个处理器。通过该引用,处理者可以连成一条链。 ConcreteHandler(具体处理者):它是抽象处理者的子类,可以处理用户请求,在具体处理者类中实现了抽象处理者中定义的抽象请求处理方法,在处理请求之前需要进行判断,看是否有相应的处理权限,如果可以处理请求就处理它,否则将请求转发给后继者;在具体处理者中可以访问链中的下一个对象,以便转发请求纯责任链模式 1. 一个具体的请求只能选择其中一个处理器:要么承担前部责任,要么把处理责任推给下家,不允许出现某个处理器处理了一部分又继续向下传递。 2. 一个请求必须被某一个处理者对象所接收,不能出现某个请求未被任何一个处理者对象处理的情况。不纯的责任链模式 1. 允许某个请求被一个具体的处理器处理后再向下传递 2. 一个具体的处理器处理完某请求后还可以继续处理该请求 3. 一个请求最终可以不被任何处理器所处理
不纯的责任链模式
AbstractSuppot
+ name:String + next:AbstractSupport
+ handleRequest(Object):void+ setNextHandler(AbstractSupport):return AbstractSupport
AbstractSupport
+ name:String + next:AbstractSupport
+ process(Object):void- fail(Object)- done(Object)- resolve(Object):Boolean+ setNext(AbstractSupport):AbstractSupport
package com.zero.headfirst.chain.support;import java.util.Objects;/** * 抽象处理器:定义了抽象请求处理方法,持有一个抽象处理器的引用,用于生成一条处理链 */public abstract class AbstractSupport { private String name; private AbstractSupport next; /** * 定义处理请求的算法模板 */ public final void process(NumberData numberData) { if (resolve(numberData)) { done(numberData); } else if (Objects.nonNull(next)) { next.process(numberData); } else { fail(numberData); } } /** * 无法处理 * @param numberData */ protected void fail(NumberData numberData) { System.out.println(numberData + \" cannot be resolved.\"); } /** * 成功处理 * @param numberData */ protected void done(NumberData numberData) { System.out.println(numberData + \" is resolved by \" + this + \".\"); } /** * 判断是否能处理,子类重写 * @param numberData * @return */ protected abstract boolean resolve(NumberData numberData); public AbstractSupport setNext(AbstractSupport next) { this.next = next; return next; } public AbstractSupport(String name) { this.name = name; } @Override public String toString() { return \"AbstractSupport{\" + \"name='\" + name + '\\'' + '}'; }}
纯责任链模式
package com.zero.design.actions.dutychain;/** * 责任链抽象类,包含核心处理方法,以及后继责任处理器设置.由不同的处理器继承 */public abstract class AbstractLeaderHandler { protected String handlerName; /** * 责任链上的后继对象,即这个对象无法处理,就转移给下一个Leader */ protected AbstractLeaderHandler nextLeaderHandler; public AbstractLeaderHandler(String handlerName) { this.handlerName = handlerName; } /** * 处理请求的核心的业务方法 * 需要不同继承该类的处理器自己实现 * @param request */ public abstract void handleRequest(LeaveRequest request); /** * 设定责任链上的后继对象 * @param nextLeaderHandler */ public AbstractLeaderHandler setNextLeaderHandler(AbstractLeaderHandler nextLeaderHandler) { this.nextLeaderHandler = nextLeaderHandler; return nextLeaderHandler; }}
0 条评论
下一页