【说明】
已知某企业的采购审批是分级进行的,即根据采购金额的不同由不同层次的主管人员来审批,主任可以审批5万元以下(不包括5万元)的采购单,副董事长可以审批5万元至10万元(不包括10万元)的采购单,董事长可以审批10万元至50万元(不包括50万元)的采购单,50万元及以上的采购单就需要开会讨论决定。
采用责任链设计模式(Chain of Responsibility)对上述过程进行设计后得到的类图如图7-1所示。
【Java 代码】
class PurchaseRequest
public double Amount; // 一个采购的金额
public int Number; // 采购单编号
public String Purpose; // 采购目的
;
class Approver // 审批者类
public Approver() successor = null;
public void ProcessRequest(PurchaseRequest aRequest)
if (successor != null) successor. (1) ;
public void SetSuccesser(Approver aSuccesssor) successor = aSuccesssor;
private (2) successor;
;
class Congress extends Approver
public void ProcessRequest(PurchaseRequest aRequest)
if(aRequest,Amount >= 500000) // 决定是否审批的代码省略
else (3) .ProcessRequest(aRequest);
;
class Director extends Approver
public void ProcessRequest(PurchaseRequest aRequest) // 此处代码省略
;
class President extends Approver
public void ProcessRequest(PurchaseRequest aRequest) // 此处代码省略
;
class VicePresident extends Approver
public void ProcessRequest(PurchaseRequest aRequest) // 此处代码省略
;
public class rs
public static void main(String[] args) throws IOException
Congress Meeting = new Congress();
VicePresident Sam = new VicePresident();
Director Larry = new Director();
President Tammy = new President();
// 构造责任链
Meeting. SetSuccessor(null); Sam. SetSuccessor( (4) );
Tammy. SetSuccessor( (5) ); Larry. SetSuccessor( (6) );
//构造一采购审批请求
PurchaseRequest aRequest = new PurchaseRequest();
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
aRequest.Amount = Double.parseDouble(br.readLine());
(7) .ProcessRequest(aRequest); // 开始审批
return ;
}
依次填入程序中(1)~(7)处中。
参考答案:
(1)ProeessRequest(aRequest)
(2)Approver
(3)super
(4)Tammy
(5)Meeting
(6)Sam
(7)Larry
解析:
[分析]:
本题考查的是没计模式的应用,属于比较传统的题目。责任链设计模式属于常用的23种设计模式之一。其目的是为了将一个请求发送给一个对象集合,对象被组织成一条链,而负责处理该请求的对象将获取请求消息并处理,其余对象则仅仅负责将该请求消息按照责任链的顺序传递到下一个对象。因此责任人链模式的关键在于组织不同的对象成为一条链并传递消息。
代码中空(1)处位于条件判断汀(successor!=NULL)内,因此其含义是判断当前对象是否存在后继对象,如果存在,按照责任链设计模式,可以把请求消息进行传递,也就是调用后继对象的ProcessRequest方法。空(2)处要求填写successor的类型,因为责任链模式中的每一个对象都继承自同一个父类,在本题中,就是Approver类型。空(3)处位于Congress类中的ProcessRequest方法中,该方法表示处理外界的请求,else块的含义表明Congress对象不处理当审批金额大于50万元的请求,因此,Congress对象应该将该请求转发到下一个对象进行处理,可以直接调用父类的ProcessRequest方法。空 (4)、(5)、(6)主要用来将各种对象串接成一个链,根据题目的要求,对象在责任链中的顺序应该为Director Larry:VicePresident Sam;President Tammy;Congress Meeting,而审批的请求应该从Larry开始。