概述
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
这一模式的想法是,给多个对象处理一个请求的机会,从而解耦发送者和接受者.
适用性
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
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>