设计方式(13)-行为型-责任链模式(Chain of Responsibility)
设计模式(13)-行为型-责任链模式(Chain of Responsibility)
并沿着这条链传递该请求,直到有一个对象处理它为止。
这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者.
2.你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3.可处理一个请求的对象集合应被动态指定。
定义一个处理请求的接口。 (可选)实现后继链。
2.ConcreteHandler
处理它所负责的请求。 可访问它的后继者。
如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3.Client
类图:
概述
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者.
适用性
1.有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。2.你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3.可处理一个请求的对象集合应被动态指定。
参与者
1.Handler定义一个处理请求的接口。 (可选)实现后继链。
2.ConcreteHandler
处理它所负责的请求。 可访问它的后继者。
如果可处理该请求,就处理之;否则将该请求转发给它的后继者。
3.Client
向链上的具体处理者(ConcreteHandler)对象提交请求。
类图:
示例
package com.sql9.actioned; /** * 责任链模式 示例 * 以结婚为例, 男方取身份证和户口簿(派出所),婚姻状况证明(单位、居委会或村委会开具), * 女方取身份证和户口簿,婚姻状况证明 * (现在已经不用婚检了) * 然后去民证局登记 */ abstract class Request { } /** * 身份证、户口 */ class IDRequest extends Request { String id; public IDRequest(String id) { this.id = id; } } /** * 婚姻状况 */ class MariageStatusRequest extends Request { String status; public MariageStatusRequest(String status) { this.status = status; if ("已婚".equals(status)) { throw new RuntimeException("异常,目标为已婚用户,不能申请结婚"); } } } /** * 登记注册 */ class RegisterRequest extends Request { String otherId; public RegisterRequest(String otherId) { this.otherId = otherId; } } interface MariageHandler { void handleRequest(Request request); } /** * 派出所处理 */ class PoliceHandler implements MariageHandler { @Override public void handleRequest(Request request) { if (request instanceof IDRequest) { String id = ((IDRequest)request).id; System.out.println("Policehandler handled, targetId = " + id); } System.out.println("finished for PoliceHandler."); } } /** * 本单位处理 * */ class CompanyHandler implements MariageHandler { MariageHandler rh; public CompanyHandler(MariageHandler rh) { this.rh = rh; } @Override public void handleRequest(Request request) { if (request instanceof MariageStatusRequest) { String status = ((MariageStatusRequest)request).status; System.out.println("CompanyHandler handled, status = " + status); if ("已婚".equals(status)) { throw new RuntimeException("异常,目标为已婚用户,不能申请结婚"); } } else { rh.handleRequest(request); } } } /** * 民政局处理 * */ class CivilServiceHandler implements MariageHandler { MariageHandler rh; public CivilServiceHandler(MariageHandler rh) { this.rh = rh; } @Override public void handleRequest(Request request) { if (request instanceof RegisterRequest) { String otherID = ((RegisterRequest)request).otherId; System.out.println("CivilServiceHandler handled, otherId = " + otherID); } else { rh.handleRequest(request); } } } public class TestChainOfResponsibility { public static void main(String[] args) { MariageHandler ph = new PoliceHandler(); MariageHandler companyH = new CompanyHandler(ph); MariageHandler civilH = new CivilServiceHandler(companyH); // 处理请求 Request req = new IDRequest("1000101990xxxxxxxx"); ph.handleRequest(req); req = new MariageStatusRequest("未婚"); companyH.handleRequest(req); req = new RegisterRequest("3000101990xxxxxxxx"); civilH.handleRequest(req); } }
结果
Policehandler handled, targetId = 1000101990xxxxxxxx finished for PoliceHandler. CompanyHandler handled, status = 未婚 CivilServiceHandler handled, otherId = 3000101990xxxxxxxx