描述 责任链模式(CoR)建议发出请求的对象与可能处理这个请求的对象集合之间是低耦合的(set of potential request handler objects) 在有不止一个对象可以处理或实现(fulfill)客户请求的时候责任链模式(CoR)认为顺序地给每一个对象一次处理请求的机会在这种情况下应用责任链模式(CoR)把每一个可能处理请求的对象以链表的形式组织起来在链表中每一个对象有一个指向下一个对象的指针(Pointer)在链表中的第一个对象接受请求并且决定是否处理它或者把它传递 给下一个对象请求一个接一个地遍历(flow through)链表中的所有对象直到请求被其中的一个对象处理或者因到达链表尾而没有被处理 例如如果A?〉B?〉C都可以处理请求按照这个顺序A处理请求或者在不知B是否可以处理这个请求的情况下递给B接受到请求的B可以处理这个请求或者传递给C 当C收到请求时这个请求可以被C处理或者没有经过任何处理而结束换句话说提交的处理链表中的请求在到达链表尾前可以不被任何处理 下面是责任链模式(CoR)一些重要的特征 ()可能处理请求的对象集合(set of potential request handler objects)以及它们在链表中的顺序是由客户端根据现应用的状态在运行时动态决定的 ()客户端根据现在的状态对于不同的请求类型可以拥有不同的可能处理请求的对象集合(set of potential request handler objects)一个处理请求的对象也可以根据客户应用的状态和请求类型把请求传递给不同的处理对象为了使这些交互简单所有的可能处理请求的对象应提供一致的接口在JAVA中不同处理对象可以实现一个共同的接口或者继承同一个抽象的父类来实现 ()客户对象初始化请求或者在不知道这些对象是否能处理这个请求的情况下初始化任何可能处理请求的对象也就是说客户对象和在处理链表中的处理对象都不需要知道到底哪个对象去处理这个请求 ()请求不能保证被处理也就是在没有处理的情况下请求已经到达了处理链表尾下面的这个情景展示了一个购买请求传递到处理链表中但是在到达链表尾时并没有被接受 例子 让我们模拟一个在特定组织里的购买请求(PR)授权过程的应用通常在确立订单并发到卖方前一个购买请求是需要不同的管理代表授权的我们假定一个组织中在购买请求金额限制上分为四个授权管理层次如下面的列表 Table : Levels of PR Authorization Management Level Authorization Limit Branch Manager$ Regional Director$ Vice President$ President and COO$ 我们可以定义不同的类来对应上面列表中的不同管理层次 Listing : Classes Representing Different Management Levels class BranchManager { static double LIMIT = ; … … }//End of class class RegionalDirector { static double LIMIT = ; … … }//End of class class VicePresident { static double LIMIT = ; … … }//End of class class PresidentCOO { static double LIMIT = ; … … }//End of class 让我们定义一个PurchaseRequest类它代表购买请求 PurchaseRequest ID:int description:String amount:double getAmount():double Figure : PurchaseRequest Class Representation Listing : PurchaseRequest 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; } } 一个给定的购买请求(PR)被上面的管理代表所授权或处理换句话说代表不同管理层次的四个类都是处理给定购买请求的可能处理者(授权者)因此不建议PurchaseRequest实例榜定到任何的一个授权者通过使用责任链模式(CoR)实现了PurchaseRequest对象和可能授权请求的对象集合之间关联的低耦合 利用责任链模式(CoR)让我们定义一个抽象类PRHandler它定义这些可能授权购买请求对象的统一接口 Listing : Abstract PRHandler Class 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; }; } Figure : Purchase Request Approver Hierarchy 现在每一个授权者被重新定义为抽象类PRHandler的子类每一个授权对象把购买请求的金额和它所在的管理层次所授权的金额进行比较如果请求的金额小于授权的金额它就可以授权购买如果大于它传递购买请求到链表中的下一个授权者 Listing : PRHandler Concrete Subclasses class BranchManager extends PRHandler { static double LIMIT = ; public BranchManager(String name) { super(name); } public boolean authorize(PurchaseRequest request) { double amount = requestgetAmount(); if (amount <= LIMIT) { Systemoutprintln( 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 = ; public RegionalDirector(String name) { super(name); } public boolean authorize(PurchaseRequest request) { double amount = requestgetAmount(); if (amount <= LIMIT) { Systemoutprintln( 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 = ; public VicePresident(String name) { super(name); } public boolean authorize(PurchaseRequest request) { double amount = requestgetAmount(); if (amount <= LIMIT) { Systemoutprintln( VP + 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 = ; public PresidentCOO(String name) { super(name); } public boolean authorize(PurchaseRequest request) { double amount = requestgetAmount(); if (amount <= LIMIT) { Systemoutprintln( President & COO + getName() + has authorized the PR ? + request); return true; } else { Systemoutprintln(PR ? + request + couldnt be authorized\n + Executive Board needs to be + consulted for approval \n + reason: Amount too large); return false; } } }//End of class 为了授权购买请求客户端需要 ()创建一个可能接受购买请求的授权对象集合把他们按照授权金额升序进行排列使用setNextHandler(PRHandler)方法连接每一个授权者下面是可能的授权购买请求的授权链表: Figure |