说明:
责任链(CoR)模式建议在发出请求的对象和该请求的潜在处理对象集之间建立一种低耦合的关联关系
CoR模式的一些重要特性:
a,处理客户请求的潜在对象集以及它们构成链条的顺序都可以有客户对象在运行时期动态地决定,决定的因素取决于应用的当前状态
b,根据其当前状态,一个客户可以拥有不同的处理对象集来处理不同类型的请求。
c,对请求进行初始化的客户对象或者将请求转发给下一个对象的任何一个潜在处理对象都不必知道知道接受请求的对象的能力。
d,不能保证请求一定能得到处理
实例:
它模拟一家典型的组织中对购买请求进行核准的过程:
代码:
public abstract class PRHandler {
private PRHandler nextHandler;
private String handlerName;
public PRHandler(String name) {
handlerName = name;
}
public String getName() {
return handlerName;
}
public abstract boolean authorize(PurchaseRequest request);
public PRHandler getNextHandler() {
return nextHandler;
}
public void setNextHandler(PRHandler handler) {
nextHandler = handler;
};
}
class BranchManager extends PRHandler {
static double LIMIT = 25000;
public BranchManager(String name) {
super(name);
}
public boolean authorize(PurchaseRequest request) {
double amount = request.getAmount();
if (amount <= LIMIT) {
System.out.println(" Branch Manager " + getName() +
" has authorized the PR - " + request);
return true;
} else {
//forward the request to the next handler
return getNextHandler().authorize(request);
}
}
} // End of class
class RegionalDirector extends PRHandler {
static double LIMIT = 100000;
public RegionalDirector(String name) {
super(name);
}
public boolean authorize(PurchaseRequest request) {
double amount = request.getAmount();
if (amount <= LIMIT) {
System.out.println(" Regional Director " + getName() +
" has authorized the PR - " +
request);
return true;
} else {
//forward the request to the next handler
return getNextHandler().authorize(request);
}
}
} // End of class
class VicePresident extends PRHandler {
static double LIMIT = 200000;
public VicePresident(String name) {
super(name);
}
public boolean authorize(PurchaseRequest request) {
double amount = request.getAmount();
if (amount <= LIMIT) {
System.out.println(" V.P. " + getName() +
" has authorized the PR - " + request);
return true;
} else {
//forward the request to the next handler
return getNextHandler().authorize(request);
}
}
} // End of class
class PresidentCOO extends PRHandler {
static double LIMIT = 400000;
public PresidentCOO(String name) {
super(name);
}
public boolean authorize(PurchaseRequest request) {
double amount = request.getAmount();
if (amount <= LIMIT) {
System.out.println(" President & COO " + getName() +
" has authorized the PR - " + request);
return true;
} else {
System.out.println("PR - " + request +
" couldn't be authorized.\n " +
"Executive Board needs to be " +
"consulted for approval \n" +
"reason: Amount too large");
return false;
}
}
} // End of class
public class PRManager {
private BranchManager branchManager;
private RegionalDirector regionalDirector;
private VicePresident vicePresident;
private PresidentCOO coo;
public static void main(String[] args) {
PRManager manager = new PRManager();
manager.createAuthorizationFlow();
PurchaseRequest request =
new PurchaseRequest(1, "Office Supplies",10000);
manager.branchManager.authorize(request);
request = new PurchaseRequest(2, "HardWare Procurement",
175000);
manager.branchManager.authorize(request);
request = new PurchaseRequest(3, "AD Campaign",800000);
manager.branchManager.authorize(request);
}
public void createAuthorizationFlow() {
branchManager = new BranchManager("Robin");
regionalDirector = new RegionalDirector("Oscar");
vicePresident = new VicePresident("Kate");
coo = new PresidentCOO("Drew");
branchManager.setNextHandler(regionalDirector);
regionalDirector.setNextHandler(vicePresident);
vicePresident.setNextHandler(coo);
}
} // End of class
class PurchaseRequest {
private int ID;
private String description;
private double amount;
public PurchaseRequest(int id, String desc, double amt) {
ID = id;
description = desc;
amount = amt;
}
public double getAmount() {
return amount;
}
public String toString() {
return ID + ":" + description;
}
}